ServerSocket 搭建服务器
用于创建服务器 , 创建完毕后,会绑定一个端口号。
ServerSocKet serversocket = new ServerSocket(int port);
创建一个基于TCP/IP协议的服务器,并绑定指定的端口号。
注意:参数port的范围是: 0-65535 (建议1025-65535)
然后此服务器可以等待客户端连接
Socket socket = server.accept();
此方法会导致线程的阻塞!直到一个新的客户端连接成功,return Socket对象后,线程在继续执行。
void close();//释放占用的端口号,关闭服务器。
每连接一个客户端 , 服务器就会得到一个新的Socket对象, 用于跟客户端进行通信
OutputStream os = socket.getOutputStream();//返回的是指向通信的另一端点的输出流
PrintStream ps = new PrintStream(os);//打印输出流
ps.println("欢迎连接服务器");
InputStream is = socket.getInputStream();//返回的是指向通信的另一端点的输入流
BufferedReader br = new BufferedReader(new InputStreamReader(is));//缓冲输入流
String text = br.readLine();//获取输入流的第一行
System.out.println("服务器接收到客户端的消息:"+text);
//服务器:
public class demo {
public static void main(String[] args) throws Exception {
//1. 启动服务器, 并侦听8888端口号
ServerSocket server = new ServerSocket(8888);
//2. 打印提示
System.out.println("服务器已启动 , 等待客户端连接中...");
//3. 等待客户端连接
Socket socket = server.accept();
System.out.println("一个客户端连接成功:"+socket.getInetAddress().toString());
//4. 获取输入流
// 4.1 获取输入流
InputStream is = socket.getInputStream();
//4.2 将输入的字节流 ,转换为字符流
InputStreamReader isr = new InputStreamReader(is);
//4.3 将字符流, 转换为逐行读取流
BufferedReader br = new BufferedReader(isr);
//5. 获取输出流
// 5.1 获取输出流
OutputStream os = socket.getOutputStream();
// 5.2 将字节输出流, 转换为打印流
PrintStream ps = new PrintStream(os);
while(true) {
//6. 循环读取一行行的数据,读取操作会导致线程的阻塞, 直到客户端真的发送了数据,
// 服务器才能接到, 顺序继续执行下面的代码
String text = br.readLine();
//7. 将这个文字, 再打印给客户端
ps.println("服务器:"+text);
if("886".equals(text)) {
break;
}
}
}
}
Socket 搭建客户端
是两台计算机之间通信的端点 , 是网络驱动提供给应用程序编程的一种接口 一套标准, 一种机制
Socket socket = Socket(String ip,int port);
创建一个套接字,并连接指定ip和端口号的服务器。
参数1.
服务器的ip地址
参数2.
服务器软件的端口号
在网络编程时,获取输入输出流的操作,对于客户端与服务器来说是相对的。
客户端的输入流,输入的是服务器的输出流输出的内容。
客户端的输出流,输出到了服务器的输入流中。
所以在使用时,需要注意以下一点规则:
客户端与服务器获取流的顺序必须是相反的:
例如:
客户端先得到了输入流,那服务器必须先获取输出流
//客户端:
public class demo1 {
public static void main(String[] args) throws Exception {
//1. 连接服务器
Socket socket = new Socket("192.168 .102 .228", 8888);
//2. 得到输出流
//2.1 得到输出流
OutputStream os = socket.getOutputStream();
//2.2 将输出流, 转换为打印流
PrintStream ps = new PrintStream(os);
//3. 得到输入流
//3.1 得到输入流
InputStream is = socket.getInputStream();
//3.2 将字节输入流, 转换为字符输入流 , 并转换为逐行读取流
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
//4. 循环接收用户输入
Scanner input = new Scanner(System.in);
while (true) {
System.out.println("请输入要发送给服务器的内容");
String text1 = input.nextLine();
//5. 将用户输入的内容, 发送给服务器
ps.println(text1);
//6. 接收服务器回复的消息
String text2 = br.readLine();
System.out.println(text2);
if (text2.equals(text1)) {
break;
}
}
}
}
案例
public class Demo {
/**
* TCP协议的网络编程
* 服务器
*/
public static void main(String[] args) throws IOException {
//搭建服务器
ServerSocket server = new ServerSocket(55565);
//等待客户端的连接
Socket socket = server.accept();
System.out.println("一个客户端连接了");
OutputStream os = socket.getOutputStream();
PrintStream ps = new PrintStream(os);
ps.println("欢迎连接服务器");
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String text = br.readLine();
System.out.println("服务器接收到客户端的消息:"+text);
System.out.println("服务器程序执行结束");
}
}
//运行结果
一个客户端连接了
服务器接收到客户端的消息:服务器你好
服务器程序执行结束
public class ClientDemo {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1",55565);
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String text = br.readLine();
System.out.println("客户端接到服务器的消息:"+text);
OutputStream os = socket.getOutputStream();
PrintStream ps = new PrintStream(os);
ps.println("服务器你好");
}
}
//运行结果
客户端接到服务器的消息:欢迎连接服务器