网络编程之TCP协议
TCP协议概念
TCP通信需要经过创建连接、数据传送、终止连接三个步骤。
TCP通信模型中,在通信开始之前,一定要先建立相关的链接,才能发送数据,类似于生活中,“打电话”
TCP 客户端和服务器端实现
/*
tcp协议下传输数据:
客户端
服务器
基于IO
tcp协议实现客户端 : 基本流程
1.构建我是客户端 Socket(String host, int port) IP+端口号指要连接的服务器的IP与端口
2.基于IO操作
1)获取输出流
2)写出
3)刷出
4)关闭
3.关闭
*/
public static void main(String[] args) throws IOException {
System.out.println("----我是客户端---------");
//1.构建我是客户端 Socket(String host, int port)
Socket client = new Socket("127.0.0.1", 8989);
//2.基于IO操作
DataOutputStream os = new DataOutputStream(client.getOutputStream());
os.writeUTF("哈哈");
os.flush();
//3.关闭
os.close();
client.close();
}
----------------------------------------------------------------------------------------
/*
tcp协议实现服务端 : 基本流程
1.构建我是服务端 ServerSocket(int port)
2.阻塞式监听 Socket accept() 侦听对此套接字的连接并接受它。
3.IO操作
1)获取输入流
2)读入数据
3)处理数据
4)关闭
4.关闭
*/
public static void main(String[] args) throws IOException {
System.out.println("----我是服务端---------");
//1.构建我是服务端 ServerSocket
ServerSocket server = new ServerSocket(8989);
//2.阻塞式监听 Socket accept()
Socket client = server.accept();
System.out.println("----一个客户端连接成功---------");
//3.IO操作
DataInputStream is = new DataInputStream(client.getInputStream());
String str = is.readUTF();
System.out.println(str);
//4.关闭
is.close();
client.close();
server.close();
}
练习TCP【输入用户名密码,服务端判断对错】
/*
tcp协议实现单向登录客户端 :
1.构建我是客户端
2.键盘接收用户名与密码
3.基于IO操作向服务器发送数据
1)获取输出流
2)写出
3)刷出
4)关闭
3.关闭
*/
public static void main(String[] args) throws IOException {
System.out.println("----我是客户端---------");
//1.构建我是客户端 Socket(String host, int port)
Socket client = new Socket("127.0.0.1", 8989);
//2.键盘接收用户名与密码
BufferedReader rd = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入用户名 : ");
String username = rd.readLine();
System.out.println("请输入用户密码 : ");
String password = rd.readLine();
//3.基于IO操作
DataOutputStream os = new DataOutputStream(client.getOutputStream());
//username=zhangsan&password=123
os.writeUTF("username="+username+"&password="+password);
os.flush();
//3.关闭
os.close();
rd.close();
client.close();
}
-----------------------------------------------------------------------------------------------
/*
tcp协议实现服务端 : 基本流程
1.构建我是服务端
2.阻塞式监听
3.IO操作接收客户端数据
1)获取输入流
2)读入数据
3)处理数据
4)关闭
4.关闭
*/
public static void main(String[] args) throws IOException {
System.out.println("----我是服务端---------");
//1.构建我是服务端 ServerSocket
ServerSocket server = new ServerSocket(8989);
//2.阻塞式监听 Socket accept()
Socket client = server.accept();
System.out.println("----一个客户端连接成功---------");
//3.IO操作
DataInputStream is = new DataInputStream(client.getInputStream());
String str = is.readUTF(); //username=zhangsan&password=1234 //zhangsan 1234
String msg = "username="+"zhangsan"+"&password="+"1234";
if(msg.equals(str)){
System.out.println("登录成功");
}else{
System.out.println("登录失败");
}
//4.关闭
is.close();
client.close();
server.close();
}
tcp协议实现双向通信
/*
tcp协议实现双向登录客户端 :
1.构建我是客户端
2.键盘接收用户名与密码
3.基于IO操作向服务器发送数据
4.基于IO操作接收服务器响应的结果
5.处理结果
6.关闭
*/
public static void main(String[] args) throws IOException {
System.out.println("----我是客户端---------");
//1.构建我是客户端 Socket(String host, int port)
Socket client = new Socket("127.0.0.1", 8989);
//2.键盘接收用户名与密码
BufferedReader rd = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入用户名 : ");
String username = rd.readLine();
System.out.println("请输入用户密码 : ");
String password = rd.readLine();
//3.基于IO操作向服务器发送数据
DataOutputStream os = new DataOutputStream(client.getOutputStream());
//username=zhangsan&password=123
os.writeUTF("username="+username+"&password="+password);
os.flush();
//4.基于IO操作接收服务器响应的结果
DataInputStream is = new DataInputStream(client.getInputStream());
String result = is.readUTF();
//5.处理结果
System.out.println(result);
//6.关闭
is.close();
os.close();
rd.close();
client.close();
}
-------------------------------------------------------------------------------------
/*
tcp协议实现双向服务端 : 基本流程
1.构建我是服务端
2.阻塞式监听
3.IO操作接收客户端数据
4.处理数据
5.IO操作将结果响应给客户端
4.关闭
*/
public static void main(String[] args) throws IOException {
System.out.println("----我是服务端---------");
//1.构建我是服务端 ServerSocket
ServerSocket server = new ServerSocket(8989);
//2.阻塞式监听 Socket accept()
Socket client = server.accept();
System.out.println("----一个客户端连接成功---------");
//3.IO操作收客户端数据
DataInputStream is = new DataInputStream(client.getInputStream());
String str = is.readUTF(); //username=zhangsan&password=1234 //zhangsan 1234
//4.处理数据
String uname = "";
String upwd = "";
String[] arr = str.split("&");
for(String s:arr){
String[] arr2 = s.split("=");
if("username".equals(arr2[0])){
uname = arr2[1];
}else if("password".equals(arr2[0])){
upwd = arr2[1];
}
}
//5.IO操作将结果响应给客户端
DataOutputStream os = new DataOutputStream(client.getOutputStream());
if("zhangsan".equals(uname) && "1234".equals(upwd)){
os.writeUTF("登录成功");
}else{
os.writeUTF("登录失败");
}
os.flush();
//4.关闭
os.close();
is.close();
client.close();
server.close();
}