java Socket通信

字体大小: 中小 标准 ->行高大小: 标准
   以前可以写出Java Socket通信的代码,但是一个偶然的机会发现自己写的代码实在是太蠢了。我居然每发一段数据都会关掉原有的Socket重新开启一个Socket,这种方式实在是太浪费资源。一个偶然的机会,我结合网络的基础知识和自己写的代码仔细推敲了下,发现了其中的问题。

    首先,利用ServerSocket和Socket进行TCP通信时,服务器端利用构造函数申明ServerSocket会绑定一个端口号,然后阻塞在.accept()方法中,客户端的Socket连接到这个端口号时,服务器端也会形成一个相应的Socket。而这一对Socket就是这一次通信的Socket,接下来的事就像对I/O读写一样来操作Socket即可。当不需要使用时进行关闭。下一次需要通信时,可以再开一个Socket。不知道还有没有人和我一样从前以为发一串数据,就得重新开一个Socket。

    服务器端代码:
        
 public class Server extends Thread
 {
    Socket socket=null; 
    BufferedReader read=null;      
    @Override
    public void run() { 
        try 
        {
            ServerSocket server=new ServerSocket(7777);
            socket=server.accept();             
            read=new BufferedReader(new InputStreamReader(socket.getInputStream()));
            while(true)
            {                 
                String content="";
                String line=""; 
                content=read.readLine();
                if(!content.equals(""))
                    System.out.println("客户端:"+content); 
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        }         
    }
 
    public static void main(String[] arg)
    {
        Server server=new Server();
        server.start();         
    }
} 

    客户端代码:
 public class Client extends Thread{
    Socket client=null;     
    BufferedWriter write=null;     
    BufferedReader read=null;     
    @Override
    public void run() {
        // TODO Auto-generated method stub 
        try {
            client=new Socket("127.0.0.1",7777);             
            write=new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));             
            read=new BufferedReader(new InputStreamReader(System.in));
            while(true)
            {                 
                String s=read.readLine();                 
                write.write(s);
                write.newLine();
                write.flush();
            }             
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }       
    }
 
     
    public static void main(String[] arg)
    {         
            Client client=new Client();
            client.start();         
    }
} 

    这个服务器端代码和客户端代码完成的功能是在客户端输入,服务器端显示的功能。

    值得注意的地方是:

    代码中对Socket的读写需要成套使用,如果在客户端采用

BufferedWriter write=new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
write.write(s);
write.newLine();
write.flush(); 

    那么服务器端需要采用:

BufferedReader read=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String content=read.readLine(); 

    

    还有另一种读写方式:

//客户端
DataOutputStream write=new DataOutputStream(client.getOutputStream());
write.writeUTF(s);
 
//服务器端
DataInputStream read=new DataInputStream(socket.getInputStream());
String content=read.readUTF(); 

    

    此外,采用PrintStream也是可以的:

1234567 PrintStream write=new PrintStream(client.getOutputStream());
write.println(s);
write.flush();
 
//服务器端
DataInputStream read=new DataInputStream(socket.getInputStream());
String content=read.readUTF(); 

 

此文章由 http://www.ositren.com 收集整理 ,地址为: http://www.ositren.com/htmls/67697.html