java实现的hello/hi的简单的网络聊天程序

淺唱寂寞╮ 提交于 2021-02-17 02:59:41

[toc]

socket基础知识

socket概念

socket是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。
应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口。应用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务

socket通信过程

socket通信过程如下图所示

java socket编程

java的socket实现其实是通过调用操作系统的socket api实现的,下面图展示其调用关系

示例程序

Server.java

package com.zavier;

import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) {
        try {
            ServerSocket serverSocket=new ServerSocket(8888);
            while(true){
                Socket socket=serverSocket.accept();
                Thread thread=new Thread(new Listener(socket));
                thread.start();
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }
}

Listenr.java

package com.zavier;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.Socket;

public class Listener implements Runnable{
    private Socket socket;

    public Listener(Socket socket){
        this.socket=socket;
    }

    @Override
    public void run(){
        InetAddress address = socket.getInetAddress();
        int port=socket.getPort();
        try{
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String data;
            while((data = in.readLine()) != null){
                System.out.println("["+address+":"+port+"]:"+data);
            }
            socket.close();
        }
        catch (Exception e){
            System.out.println(e.getMessage());
        }
    }
}

Client.java

package com.zavier;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class Client {

    public static void main(String[] args) {
        String serverName = "127.0.0.1";
        int port = 8888;

        try{
            Socket socket=new Socket(serverName,port);

            //由系统标准输入设备构造BufferedReader对象
            BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
            //由Socket对象得到输出流,并构造PrintWriter对象
            PrintWriter os=new PrintWriter(socket.getOutputStream());

            String readline;
            //从系统标准输入读入一字符串
            readline=sin.readLine();
            while(!readline.equals("bye")) {
                //将从系统标准输入读入的字符串输出到Server
                os.println(readline);
                //刷新输出流,使Server马上收到该字符串
                os.flush();
                readline=sin.readLine();
            }
            os.close();
            socket.close();
        }
        catch (Exception e){
            e.printStackTrace();
        }


    }
}

运行截图

参考链接

https://www.cnblogs.com/riacool/archive/2010/12/14/1905404.html https://blog.csdn.net/vipshop_fin_dev/article/details/102966081

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!