一、java.net包
Socket指的是客户端的Socket
ServerSocket指的是服务器端的Socket
accept()方法用来监听请求
二、具体实例
一、服务器端
一、首先定义服务器端的Scoket:服务器端是用的ServerSocket,通过ServerSocket来定义服务器端我的这个服务所对应的的端口数:ServerSocket serverSocket = new ServerSocket(5000)。
二、在服务器端用accept()方法来监听是否有人要访问我这个端口。accept()方法返回的是一个Socket对象,用Socket来接受: Socket socket = serverSocket.accept();(在accept()方法源码中,首先判断的应该是这个端口能不能被访问,根据状态的不同做出不同的回应;如果可以接受客户端的请求,那我就需要和你进行数据交换,那我自己就需要一个Socket,该方法直接创建了一个Socket对象。在本例中,因为ServerSocket 并没有被占用,所以可以做出回应。所以就直接创建并返回了一个Socket对象)。
三、我创建完我的Socket之后,就代表我可以跟你进行数据互换了。此时则可以调用Socket的 socket.getInputStream()方法,读取输入流数据:
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String info;
while ((info = br.readLine()) != null) {
System.out.println("客户端说:" + info);
}
四、在我服务器端读取了你提供过来的数据之后,我需要给你一个回应,此时通过 Socket的socket.getOutputStream()方法来输出数据:
String reply = "朕知道了";
OutputStream os = socket.getOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
bw.write(reply);
五、结束之后关闭所有的流的socket:
bw.close();
os.close();
br.close();
is.close();
socket.close();
serverSocket.close();
二、客户端
一、我要向服务器发送请求服务,使用Socket,同时要提供服务器端的ip地址和我的请求的服务的端口数:Socket socket = new Socket("localhost", 5000);
二、要把我的数据通过socket 的socket.getOutputStream();方法传送出去,传送完毕之后要关闭socket:
String info = "用户名是:tom; pwd:123456";
byte[] infos = info.getBytes();
OutputStream os = socket.getOutputStream();
os.write(infos);
socket.shutdownOutput();
三、我要接受服务器给我发回来的数据,用socket.getInputStream()方法:
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String reply;
while((reply = br.readLine()) != null){
System.out.println(reply);
}
四、关闭所有的流:
br.close();
is.close();
os.close();
socket.close();
三、传对象
其实就是对象的序列化与反序列化
一、客户端
User user = new User("tom", "12345");
OutputStream os = socket.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(os);
oos.writeObject(user);
socket.shutdownOutput();
二、服务器端
InputStream is = socket.getInputStream();
ObjectInputStream ois = new ObjectInputStream(is);
User user = (User)ois.readObject();
System.out.println(user.getUserName()+user.getPwd());
四、总结
综上,socket是什么?我一个计算机可以提供很多服务,但是我只有一个ip地址,我需要通过端口数来区分我提供的这些不同的服务,同时方便别的计算机识别与访问。当别的计算机需要请求我的某一个服务时,就需要和我进行数据交换,而socket就是数据交换的工具,我们不需要关心socket是怎么实现数据交换的,我们只用知道socket里面有获取输入输出流等方法可以让我们进行数据交换就行了。