TCP程序的基本实现
TCP的程序开发是网络程序的最基本的开发模型,其核心的特点是使用两个类实现数据的交互处理:ServerSocket(服务端)、Socket(客户端)。
ServerSocket的主要目的是设置服务器的监听端口,而Socket需要指明要连接的服务器地址和端口。下面实现一个最简单的数据处理操作,即Echo程序实现。
范例:实现服务器端的定义
package cn.mldn.demo.service;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class EchoServer {
public static void main(String[] args) throws Exception {
ServerSocket server = new ServerSocket(9999);//设置服务端的监听端口
System.out.println("等待客户端连接................");
Socket client = server.accept();//有客户端连接
//1、首先需要先接收客户端发来的信息,而后才可以将信息处理后发送回客户端
Scanner scanner = new Scanner(client.getInputStream());//客户端输入流
scanner.useDelimiter("\n");//设置分隔符
PrintWriter out = new PrintWriter(client.getOutputStream());//客户端输出流
boolean flag = true;//循环标记
while (flag) {
if (scanner.hasNext()) {//现在有数据发送
String val = scanner.next().trim();//接收发送的数据
if ("byebye".equalsIgnoreCase(val)) {
out.println("ByeByeBye....");
flag = false; // 结束循环
} else {
out.println("【ECHO】" + val);
out.flush(); // 强制刷新缓冲区
}
}
}
scanner.close();
out.close();
client.close();
server.close();
}
}
如果此时需要对程序进行测试,最好的方法是直接使用telnet命令完成,但是此命令在windows7之后已经变为了默认不开启的状态,所以如果要想使用则必须单独启用此命令。
在服务器端开户的情况下通过telnet指令输入:open localhost 9999
范例:实现客户端的定义
package cn.mldn.demo.client;
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 KEYBOARD_BUF = new BufferedReader(new InputStreamReader(System.in));
public static void main(String[] args) throws Exception{
Socket client = new Socket("localhost",9999);//定义服务端连接信息
//现在的客户端需要有输入与输出的操作支持,所以依然要准备出Scanner与PrintWriter
Scanner scanner=new Scanner(client.getInputStream());//接收服务器端的输入内容
scanner.useDelimiter("\n");
PrintStream out = new PrintStream(client.getOutputStream());//向服务器发送内容
boolean flag = true;//循环标记
while (flag){
String input = getString("请输入要发送的内容:").trim();
out.println(input);//加换行
if (scanner.hasNext()){//服务端有回应了
System.out.println(scanner.next());
}
if ("byebye".equalsIgnoreCase(input)) {
flag = false;
}
}
scanner.close();
out.close();
client.close();
}
public static String getString(String prompt) throws Exception{
System.out.print(prompt);
String str = KEYBOARD_BUF.readLine();
return str;
}
}
此时就实现了一个最基础的客户端与服务端之间的数据通讯操作。