Java 实现简单Socket通信

本文介绍了网络通讯的基本概念,包括IP、端口、Socket、服务器、客户端、域名及DNS的作用,深入解析了HTTP协议,并通过示例展示了如何使用Socket进行网络通讯编程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.网络通讯名词简介

  • IP:Internet Protocol,即互联网协议。IP现在通用的版本是IPv4,。地址是四个 byte  的数字,用点分开。正在实施的IPv6地址会复杂得多。每个机器都有一个IP地址。IP地址又分内网和外网地址,就像是我们的小名和官方大名。只有外网地址才能用来外网通讯
  • port:端口。和 IP 地址一起,可以唯一的确定一个网络连接的目的地。计算机的端口是用无符号的16个 bit 表示的,所以端口的范围是 0-65535,不能超过这个范围
  • Socket:套接字,就好像插座,可以服务不同的目的。我们经常说的连到什么机器的什么端口,建立的就是这个Socket连接
  • Socket 包含本地的(IP 地址 + 端口)以及远程的(IP 地址 + 端口)
  • 服务器:处理客户端网络请求的机器。监控本机某个端口,等着客户端使用服务器的IP + 端口来建立网络连接。连接建立起来之后,就可以进行数据的交换了。服务器要先启动,否则客户端连接就会失败。
  • 客户端:通过指定IP 和 端口,连接到服务器端,客户端和服务器的数据交换是独立的,可以同时进行数据的输入和输出
  • 域名和DNS(Domain Name System):一般服务器都会使用域名让客户端连接,DNS 可以将域名翻译成IP地址
  • 我们平时说的上网就是通过域名,连接服务器的80端口,读取内容,并让浏览器帮我们去渲染,生成千姿百态的网页,80端口默认的http 协议的端口
  • http 协议 Hyper Text Teansfer Protocol,就是我们平时上网的协议

2.使用 Socket 实现通讯

public class MyChat {

    private String from;
    private String greeting;
    private Socket s;

    public MyChat(String from, String greeting, Socket s) {
        this.from = from;
        this.greeting = greeting;
        this.s = s;
    }

    public void chatting(){
        Scanner in = new Scanner(System.in);
        try(
                BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream(), MyServer.MY_COMM_CHARSET));
                PrintWriter pr = new PrintWriter(new OutputStreamWriter(s.getOutputStream(),MyServer.MY_COMM_CHARSET))
        ) {
            if (greeting != null){
                pr.println(greeting);
                pr.flush();
            }
            while (true){
                String line = br.readLine();
                if (line != null){
                    if (MyServer.BYE.equals(line)){
                        pr.println(MyServer.BYE);
                        break;
                    }else {
                        System.out.println(from+":"+line);
                        String myWord = in.nextLine();
                        pr.println(myWord);
                        pr.flush();
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


public class MyServer {

    public static final Charset MY_COMM_CHARSET = StandardCharsets.UTF_8;
    public static final int MY_SERVER_PORT = 54321;
    public static final String BYE = "88";

    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(MY_SERVER_PORT);
        Socket s = ss.accept();
        MyChat myChat = new MyChat("客户端","你已经连接上服务端了",s);
        myChat.chatting();
    }

}

public class MyClient {

    public static void main(String[] args) {
        try (
                Socket socket = new Socket("localhost", MyServer.MY_SERVER_PORT);
        ) {
            MyChat myChat = new MyChat("服务端", null, socket);
            myChat.chatting();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

先启动server,然后启动client,在控制台输入信息

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值