java网络io和tcp_程序员:Java网络编程-TCP协议的模拟

关于TCP 先通俗的说一下客户端先与服务端会先建立一条通信管道,之后客户端向服务端发请求,服务端进行回应如下图

c0dac33d07deaf7cdb9a0abfb6a3d3c8.png

管道里的操作用到了Java中的IO流

基本步骤:

客户端

1.建立连接:调用Socket(String host,int port)连接服务端

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();

}

//--------------------------------------------

}

}

}

测试如图:

b99f46b23a6ac4b6d753724af5b4a1bc.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值