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();
}
//--------------------------------------------
}
}
}
测试如图:
初写博客 有错的地方希望大家能在评论区指正!共同进步!