首页 > 技术文章 > 服务器和客户端Socket单向通信例子

liushao 2017-02-08 16:21 原文

看了两天socket通信,也参考了网上其他人是怎么写的。

下面我把最简单的socket例程贴出来

server代码:

public class Server {

    private static int port = 8888;  
    private static ServerSocket serverSocket;  
    private static Socket socket;
    
    public static void main(String args[]) throws IOException {  

        serverSocket = new ServerSocket(port, 2);  
        socket = serverSocket.accept();  
        System.out.println("客户端已链接");  
          
        DataInputStream dis = new DataInputStream(socket.getInputStream()); 
        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
        dos.writeUTF("来自服务器的消息");
        
        while (true){  
            /*
            //读取客户端发送的信息
            String str = dis.readUTF();
            System.out.println("From 客户端:"+str);
            
            if(str.equals("bye")){  
                socket.close();  
                serverSocket.close();  
                break;  
            }  
            */
            // 发送键盘输入的一行    
             String s = new BufferedReader(new InputStreamReader(System.in)).readLine(); 
             dos.writeUTF(s);
        }   
    }  
}

Client代码:

public class Client {

    private static int port = 8888;  
    private static String host = "localhost";  
    private static Socket socket;  
    
    public static void main(String args[]) throws UnknownHostException,  
            IOException {  
        socket = new Socket(host, port);  
        
        DataInputStream dis = new DataInputStream(socket.getInputStream()); 
        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
        dos.writeUTF("来自客户端的消息");
        
        while(true){  
            //读取服务器发送的信息
            String str = dis.readUTF();
            System.out.println("From 服务器:"+str);
            
            if(str.equals("bye")){  
                socket.close();  
                System.out.println("关闭socket");  
                break;  
            } 
            // 发送键盘输入的一行    
            //String s = new BufferedReader(new InputStreamReader(System.in)).readLine(); 
            //dos.writeUTF(s);
        }     
    } 
}

 

因为readLine()是一个阻塞函数,接收不到消息会阻塞在那里。如果把两个文件中的注释去掉后,服务器和客户端必须你一句我一句,才能正常通信。目前还没有解决办法。
所以,先实现单向通信:server发送数据,client接收数据。

 

推荐阅读