Java网络编程之TCP协议的模拟

Java网络编程之TCP协议的模拟

关于TCP 先通俗的说一下
客户端先与服务端会先建立一条通信管道,之后客户端向服务端发请求,服务端进行回应
如下图
在这里插入图片描述
管道里的操作用到了Java中的IO流

基本步骤:
客户端
1.建立连接:调用Socket(String host,int port)<IP地址,端口>连接服务端
2.操作:IO流(输入还是输出)
3.释放资源
服务端
1.使用ServerSocket(int port)<端口号>创建服务端
2.阻塞式等待连接
3.操作:IO流(输入还是输出)
4.释放资源

客户端
//建立连接 连接到服务端
Socket cilent=new Socket("localhost",5656); 
//发送请求
DataOutputStream dos=new DataOutputStream(cilent.getOutputStream());
dos.writeUTF("字符串信息") ;
dos.flush();
//释放资源
dos.close();
cilent.close();
服务端
//建立服务端<指定端口号>
ServerSocket server=new ServerSocket(5656);
//调用accept方法监听连接
Socket cilent=server.accept();
//接收请求
DataInputStream dis=new DataInputStream(cilent.getInputStream());
String datas= dis.readUTF();
	//datas即为接受到的请求信息 可以根据请求 分情况的发回客户端
	//需要再写一个发送响应的代码==客户端的发送请求
//释放资源
dis.close();

基本的步骤就是这样
附上一个用多线程写的服务端 ,用来不断的接受客户端的请求,验证登陆账号密码是否正确(简单理解为QQ登陆)

——————
客户端
——————
package One5;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Client {
	public static void main(String[] args) throws Exception, IOException {
		Scanner sc=new Scanner(System.in);
		String username;
		String userpassword;
		Socket Client=new Socket("localhost",5656);
		
		//发送请求
		DataOutputStream dos=new DataOutputStream(Client.getOutputStream());
		System.out.println("请输入用户名:");
		username=sc.next();
		System.out.println("请输入密码:");
		userpassword=sc.next();
		//这里我把键盘读取的用户名和密码都发过去 中间用&隔开
		dos.writeUTF(username+"&"+userpassword);

		//接收响应
		DataInputStream dis=new DataInputStream(Client.getInputStream());
		String result=dis.readUTF();
		System.out.println(result);
		
		dos.flush();
		dos.close();
		Client.close();
	}
}
——————
服务端
——————
package One5;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
	public static void main(String[] args) throws Exception {
		ServerSocket server=new ServerSocket(5656);
		boolean flag=true;
		while(flag) 	//写一个while循环 持续的接收客户端的连接
		{
			Socket client=server.accept();
			new Thread(new dxc(client)).start();
		}
	}

	public static int num=0;
	
	static class dxc implements Runnable{
		private Socket client;
		//输入流 输出流
		private DataInputStream dis;
		private DataOutputStream dos;
		public dxc(Socket client) {
			// TODO Auto-generated constructor stub
			this.client=client;
			try {
				dis=new DataInputStream(client.getInputStream());
				dos=new DataOutputStream(client.getOutputStream());
				System.out.println((++num)+"个已建立连接");
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				try {
					client.close();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
			
		}
		@Override
		public void run() {
			// TODO Auto-generated method stub
			//接受请求------------------------------------
			String datas = null;
			try {
				datas = dis.readUTF();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			String dats[]=datas.split("&");//分割传过来的用户名和密码
			System.out.println("username:"+dats[0]);
			System.out.println("userpassword:"+dats[1]);
			//--------------------------------------------
	
			//发送响应------------------------------------
			if(dats[0].equals("m·d")&&dats[1].equals("misdog")) {
				try {
					dos.writeUTF("登陆成功!");
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			else {
				try {
					dos.writeUTF("登陆失败!");
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			try {
				dis.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			//--------------------------------------------
		}
	}
}

测试如图:
在这里插入图片描述初写博客 有错的地方希望大家能在评论区指正!共同进步!

发布了3 篇原创文章 · 获赞 0 · 访问量 93

猜你喜欢

转载自blog.csdn.net/weixin_43416532/article/details/104119177