首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >手写一个简单的Server和Client

手写一个简单的Server和Client

作者头像
东边的大西瓜
发布2022-05-05 11:31:50
发布2022-05-05 11:31:50
3980
举报
文章被收录于专栏:吃着西瓜学Java吃着西瓜学Java

公众号发送:TCP即可获得完整项目代码!(带注释)

还记得HTTP(一)中西瓜籽的话吗?今天它来实现了!

情景再现:

西瓜籽:“这也太简单了,我知道发起一个HTTP请求和建立一个Socket连接区别不大,所以我要手写一个HttpClient(客户程序)和HTTPServer(HTTP服务器)。”

大话再现:

西瓜籽:这对我来说简直信手拈来,下面我就用Java套接字创建一个客户端和服务器端。

项目目录:

项目代码:

Server

代码语言:javascript
复制
package TCP;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class Server {
private static ArrayList<String> list = new ArrayList<>();
 static {
    list.add("zzxkj");
    list.add("zxj");
}
public static void main(String[] args) {
    ServerSocket serverSocket;
    int port = 8080;
    System.out.println("默认端口:8080");
    try {
        //创建绑定到特定8080端口的服务器套接字
          serverSocket = new ServerSocket(port);
        //返回此套接字正在侦听的端口
          System.out.println("服务器正在监听的端口:"+serverSocket.getLocalPort());
    while (true){
            try {
                //等待Client的TCP连接
           final Socket socket = serverSocket.accept();
                System.out.println("建立了与客户端的TCP连接,该客户端地址为:" + socket.getLocalSocketAddress() + socket.getLocalPort());
                service(socket);
            }catch (Exception e){
                System.out.println("与用户交互失败");
            }

        }
    } catch (IOException e) {
        e.printStackTrace();
    }

}
/***响应***/
public static void service(Socket socket) throws Exception{
    /**读取请求信息**/
    InputStream in = socket.getInputStream();
    Thread.sleep(500);//线程休眠,等待Http请求
            int size = in.available();
    byte[] bytes = new byte[size];
    byte[] select = new byte[10];//用于判断该请求是登录,还是上传图片
           in.read(bytes);
    System.arraycopy(bytes,0,select,0,5);//因为设置Login为登录标志,即前缀,所以取前五个字节
           String prefix = new String(select).substring(0,5); //取前缀
           //System.out.println(prefix+" "+prefix.length());
    /**判断是上传图片还是请求登录,并发送响应结果**/
    OutputStream out= socket.getOutputStream();//将字节写入此套接字的输出流
           byte[] buffer = new byte[20];
    if(prefix.equals("Login")){
       // System.out.println(prefix);
        String s = new String(bytes);   //取完整信息
             String follow = s.substring(5); //取用户名
            //判断是否存在该用户
           if(list.contains(follow)){
            buffer = "欢迎光临".getBytes();
            System.out.println("登录成功");
        }else {
            buffer = "该用户不存在".getBytes();
            System.out.println("登录失败");
        }

    }
   else {
        String result = new String(bytes);
        System.out.println(result);//打印结果
                    buffer = "上传成功".getBytes();
    }
    out.write(buffer);
    Thread.sleep(1000);//线程休眠,等待HTTP得到响应
           socket.close();
 }
}

Client

代码语言:javascript
复制
package TCP;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class Client {
private static String host = "localhost";
private static int port = 8080;
private static String path = "XGZ.jpg";
private static String username="zzxkj";
public static void main(String[] args) {
    System.out.println("上传文件输入1,请求登录输入2");
    Scanner sc = new Scanner(System.in);
    int k=sc.nextInt();
    if(k==1) {
        System.out.println("请输入文件名称(示例:index.html)");
        path=sc.next();
        try {
            doPost(host,port,path);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    else{
        System.out.println("请输入用户名(示例:zzxkj)");
        username=sc.next();
        try {
            doLogin(host,port,username);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
public static void doPost(String host , int port , String path) throws Exception{
    //建立一个TCP传输
            Socket socket = new Socket(host, port);
    InputStream in = Client.class.getResourceAsStream(path);
    int size = in.available();
    byte[] bytes = new byte[size];
    in.read(bytes);
    /**发送请求**/
    OutputStream out = socket.getOutputStream();
    out.write(bytes);
    //线程休眠等待响应结果
            Thread.sleep(2000);
    /**接收响应**/
    InputStream socketInputStream = socket.getInputStream();
    int length = socketInputStream.available();
    byte[] buffer = new byte[length];
    socketInputStream.read(buffer);
    String result = new String(buffer);
    System.out.println(result);
    socket.close();
}
public static void doLogin(String host , int port , String name) throws Exception{
    //建立一个TCP传输
            Socket socket = new Socket(host, port);
    StringBuilder stringBuilder = new StringBuilder("Login");
    stringBuilder.append(name);
    byte[] bytes = stringBuilder.toString().getBytes();
   /**发送请求**/
    OutputStream out = socket.getOutputStream();
    out.write(bytes);
    //线程休眠等待响应结果
           Thread.sleep(2000);
    /**接收响应**/
    InputStream socketInputStream = socket.getInputStream();
    int length = socketInputStream.available();
    byte[] buffer = new byte[length];
    socketInputStream.read(buffer);
    String result = new String(buffer);
    //打印结果
            System.out.println(result);
    socket.close();
 }
}

结果演示: 注意:这里我直接将结果打印了,如果上传照片等,应该为乱码格式。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 吃着西瓜学Java 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Server
  • Client
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档