我们先来看看源代码,这里有两个类,分别是TCPServer和TCPClient,看名字就知道意思了吧,我不用解释了;
//服务器类,用于监听客户端传来的消息;
import java.net.*;
import java.io.*;
import java.util.*;
public class TCPServer {
public static void main(String[] args){
new TCPServer().service();
}
public void service() {
ServerSocket ss = null;
Socket s = null;
BufferedReader reader = null;
String str = null;
while(true) {
try {
ss = new ServerSocket(8888);
s = ss.accept();
System.out.println("客户端上线");
reader=new BufferedReader(new InputStreamReader(s.getInputStream()));//获得s的输入流,从而得到信息
while(!"bye".equals(str)) {
str = reader.readLine();
System.out.println(str+"\t"+new Date());
}
System.out.println("客户端下线");
} catch(IOException e) {
e.printStackTrace();
} finally {
try {
s.close();
ss.close();
} catch(IOException e) {
e.printStackTrace();
}
}
}
}
}
这个类里面有一个service()方法,在这个方法中,我们new 了一个new ServerSocket(8888);通过文档,我们知道他的作用是创建一个绑定到8888端口的服务器套接字。一旦有Socket访问了8888端口,就可以通过accept()获得是哪一个Socket对象,获得该Socket对象。我在这里通过s.getInputStream()获得该Socket对象的输入流,从而,我们可以获得该输入流里面的信息;//客户端类,用于传送消息给服务器;
import java.net.*; import java.io.*; public class TCPClient { public static void main(String[] args){ new TCPClient().service(); } public void service() { Socket s =null; BufferedReader reader = null; BufferedWriter writer = null; try { s = new Socket("127.0.0.1",8888); reader = new BufferedReader(new InputStreamReader(System.in)); writer = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); String str =null; while(!"bye".equals(str)) { str =reader.readLine(); writer.write(str); writer.newLine(); writer.flush(); } } catch(IOException e) { e.printStackTrace(); } finally { try { s.close(); reader.close(); } catch(IOException e) { e.printStackTrace(); } } } }
同样,在客户端中我们实例化了一个Socket对象,通过文档,我们传入一个ip地址以及对应的端口号,也就是时说,一旦s = new Socket("127.0.0.1",8888)执行,服务器端的ss.accpet()变接受到这个实例化的对象,便可以打印出
"客户端上线",因为服务端始终处于accpet(),后面语句被堵塞。然后,我实例化了一个BufferedReader,用于获得从键盘上取得的字符,并且将这个字符写入Socket对象的输出流,从而,服务端便获得了这个输入流,得到了客户端输入的消息
具体图片如下: