以前可以写出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也是可以的:

PrintStream write=new PrintStream(client.getOutputStream());
write.println(s);
write.flush();

//服务器端
DataInputStream read=new DataInputStream(socket.getInputStream());
String content=read.readUTF();