马士兵Socket

网络编程(TCP/IP编程) != 网站编程
qq,MSN,游戏,魔兽争霸

socket:client端的插座
serversocket: TCP 服务器端的插座
UDP没有所谓的server、client

马士兵Socket_第1张图片

    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8888);
        // 服务器端也建立了一个插座
        serverSocket.accept(); // 如果client没有连接,则傻傻等待

        System.out.println("已连接");
    }
public class TCPClient {

    public static void main(String[] args) throws IOException {

        // 客户端申请连接
        Socket socket = new Socket("127.0.0.1",8888);


    }

public class TCPServer {

    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8888);
        // 服务器端也建立了一个插座
        while (true){
            Socket ss = serverSocket.accept(); // 如果client没有连接,则傻傻等待
            System.out.println("已连接");

            // 这个流是阻塞的
            DataInputStream dataInputStream = new DataInputStream(ss.getInputStream());
            String str = dataInputStream.readUTF();
            System.out.println(str);
            dataInputStream.close();
            ss.close();
            System.out.println("superkcl");

        }

    }
public class TCPClient {

    public static void main(String[] args) throws Exception {

        // 客户端申请连接
        Socket socket = new Socket("127.0.0.1",8888);

        OutputStream outputStream = socket.getOutputStream();
        DataOutputStream dos = new DataOutputStream(outputStream);
        Thread.sleep(5000);
        dos.writeUTF("hello server!");
        dos.flush();
       dos.close();
        socket.close();

    }
}

此方式是同步的
一个客户端阻塞通讯,那么server就无法继续连接了

java 推出了 异步式的网络应用, 大多数是异步式的编程!!(Tomcat、JBoss可以提供很多连接)

马士兵Socket_第2张图片

在这里插入图片描述

public class TestSocketServer {

    public static void main(String[] args) throws IOException {
        InputStream in = null;
        OutputStream out = null;


        ServerSocket serverSocket = new ServerSocket(5888);
        Socket socket = serverSocket.accept();
        in = socket.getInputStream();
        out = socket.getOutputStream();
        DataOutputStream dos = new DataOutputStream(out);
        DataInputStream dis = new DataInputStream(in);
        String str = null;
        if((str = dis.readUTF()) != null){ // 收数据
            System.out.println(str);
            System.out.println("from: " + socket.getInetAddress()+ " port: " + socket.getPort());
        }
        dos.writeUTF(" I am  server, hi hello"); // 发数据
        dis.close();
        dos.close();
        socket.close();
    }
}
public class TestSocketClient {

    public static void main(String[] args) throws Exception{
        Socket socket = new Socket("127.0.0.1", 5888);
        InputStream is = socket.getInputStream();
        OutputStream os = socket.getOutputStream();
        DataInputStream dis = new DataInputStream(is);
        DataOutputStream dos = new DataOutputStream(os);

        dos.writeUTF("hey");
        String str = null;
        if((str = dis.readUTF()) != null){
            System.out.println(str);
        }
        dos.close();
        dis.close();
        socket.close();


    }
}

服务器端先读后写,客户端先写后读
同步操作
两边都读,那么都堵塞
打开管道不操作,会报错

点对点通信,你说一句,我说一句
代码有问题

public class Server {

    public static void main(String[] args) throws Exception{
        ServerSocket serverSocket = new ServerSocket(9999);
        Socket socket = serverSocket.accept();

        PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));
        String line = sin.readLine(); // server先发送
        while(!line.equals("bye")){
            printWriter.println(line);
            printWriter.flush();

            System.out.println("server: " + line);
            System.out.println("client: " + bufferedReader.readLine());
            line = sin.readLine();
        }
        printWriter.close();
        bufferedReader.close();
        sin.close();
        socket.close();
        serverSocket.close();
    }
}
public class Client {

    public static void main(String[] args) throws Exception{

        Socket socket = new Socket("127.0.0.1", 9999);
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
        BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));
        String str = bufferedReader.readLine();
        while(!str.equals("bye")){
            printWriter.println(str);
            printWriter.flush();
            System.out.println("Client: " + str);
            System.out.println("Server: " + bufferedReader.readLine());
            str = sin.readLine();
        }
        bufferedReader.close();
        printWriter.close();
        socket.close();
    }
}

你可能感兴趣的:(#,java,java,服务器,网络)