socket通信的入门知识,适合新手入门学习
目的:
简单的socket通信,实现服务端给客户端发送消息
代码:
服务端
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
try {
// 创建监听的端口号
ServerSocket s = new ServerSocket(8888);
System.out.println("启动服务器.....");
System.out.println("等待客户机进入.......");
// 让server进入阻塞状态(等待客户机的进入),有客户机连接上此端口的server客户端就会返回一个socket对象,服务器进行接受
Socket ss = s.accept();
// socket的输出流(该流为字节流)
OutputStream out = ss.getOutputStream();
String msg = "服务器说你好";
out.write(msg.getBytes());
// 将流和socket关掉,不关掉客户端在未接受到消息的时候会断开连接
out.close();
ss.close();
s.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
客户端
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args) {
Socket s;
try {
// 客户机连接服务端的IP地址和端口号
s = new Socket("127.0.0.1", 8888);
System.out.println("连接到服务器.....");
// 获得输入流(字节流),再把字节输入流放到缓冲输入流中
InputStream in = s.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String msg = "";
msg = br.readLine();
System.out.println(msg);
// 关闭掉流和socket
br.close();
in.close();
s.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
注意:
由于读取消息的时候是readLine,该方法是读取一行信息直到读到\n(换行)指令为止
并且在服务端的输出流和客户端的输入流中联系,客户端的输入流再未接受到服务端输出流的信息时是被阻塞的。
并且在服务端的输出流和客户端的输入流中联系,客户端的输入流再未接受到服务端输出流的信息时是被阻塞的。
了解了这些,进一步的就该是,多个客户端连接到服务端,服务端和客户端之间的交互(可以收发消息)