以前可以写出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