TCP程序模型
型的基本思想在于,客户端通过键盘输入一个信息,把此信息发送给服务器端后,服务器端会将此信息反馈给客户端进行显示,本操作主要通过java.net包的两个类实现:
- ServerSocket类:封装TCP协议类,工作在服务器端
- Socket类:封装了TCP协议的操作类,每一个Socket对象都表示一个客户端
ServerSocket类的常用方法
Socket类的常用方法
ServerSocket与Socket
Echo通讯模型的实现需要通过ServerSocket类在服务器端定义数据监听端口,在没有客户端连接时将一直等待连接,每一个客户端连接到服务器端之后都通过Socket实例描述,通过Socket可以获取客户端输入流与输出流实例,这样就可以利用IO实现通讯
范例:定义Echo服务器端
package com.lxh.nineteenchapter;
import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class EchoServer {
public static void main(String[] args) throws IOException {
ServerSocket server=new ServerSocket(9999); //设置服务监听端口
System.out.println("等待客户端连接......");//打印提示信息
Socket client=server.accept();//等待客户端连接
//首先需要先接收客户端发送来的信息,而后才可以将信息处理后发送回客户端
Scanner scan=new Scanner(client.getInputStream());//客户端输入流
scan.useDelimiter("\n");//设置分隔符
PrintStream out=new PrintStream(client.getOutputStream()); //客户端输出流
boolean flag=true; //循环标记
while(flag) {
if(scan.hasNext()) { //有数据接收
String val=scan.next().trim();//接收数据内容
if("byebye".equalsIgnoreCase(val)) { //结束标记
out.println("ByeBye...."); //回应信息
flag=false; //结束循环
}else {
out.println("【Echo】"+val);
}
}
}
scan.close(); //关闭输入流
out.close(); //关闭输出流
client.close();//关闭客户端
server.close();//关闭服务器端
}
}
范例:编写客户端程序
package com.lxh.nineteenchapter;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
public class EchoClient {
private static final BufferedReader KEYBOARO_INPUT = new BufferedReader(new InputStreamReader(System.in));
public static String getString(String prompt) throws Exception { // 键盘信息输入
System.out.println(prompt);
String str = KEYBOARO_INPUT.readLine();
return str;
}
public static void main(String[] args) throws Exception {
Socket client = new Socket("localhost", 9999);// 定义服务器端的连接信息
// 现在的客户端需要有输入与输出的操作支持,所以依然要准备Scanner和PrintWriter
Scanner scan = new Scanner(client.getInputStream());// 接收服务器端的输入内容
scan.useDelimiter("\n");
PrintStream out = new PrintStream(client.getOutputStream()); // 向服务端发送内容
boolean flag = true; // 循环标记
while (flag) {
String input = getString("请输入要发送的内容").trim(); // 获取键盘输入数据
out.println(input);
if (scan.hasNext()) {
System.out.println(scan.next());
}
if ("byebye".equalsIgnoreCase(input)) {
flag = false;
}
}
scan.close();
out.close();
client.close();
}
}
执行结果
请输入要发送的内容
123
【Echo】123
请输入要发送的内容
564
【Echo】564
请输入要发送的内容
ByeBye
ByeBye....