Java ServerSocket和Socket 的网络编程

Java ServerSocket和Socket 的网络编程

Socket类
Socket(InetAddress address, int port)
创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
Socket(String host, int port)
创建一个流套接字并将其连接到指定主机上的指定端口号。
Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
创建一个套接字并将其连接到指定远程地址上的指定远程端口。
Socket(String host, int port, InetAddress localAddr, int localPort)
创建一个套接字并将其连接到指定远程主机上的指定远程端口。

close()
关闭此套接字。
connect(SocketAddress endpoint)
将此套接字连接到服务器。
connect(SocketAddress endpoint, int timeout)
将此套接字连接到服务器,并指定一个超时值。
getInetAddress()
返回套接字连接的地址。
getInputStream()
返回此套接字的输入流。
getLocalPort()
返回此套接字绑定到的本地端口。
getOutputStream()
返回此套接字的输出流。
getPort()
返回此套接字连接到的远程端口。

ServerSocket类
ServerSocket(int port)
创建绑定到特定端口的服务器套接字。
accept()
侦听并接受到此套接字的连接。
getInetAddress()
返回此服务器套接字的本地地址。

Socket编程步骤
服务器端创建ServerSocket对象,调用accept方法返回Socket对象
客户端创建Socket对象,通过端口连接到服务器
客户端、服务器端都使用Socket中的getInputStream方法和getOutputStream方法获得输入流和输出流,进一步进行数据读写操作

(InetAddress用来描述主机地址;
Socket用来创建两台主机之间的连接;
ServerSocket用来侦听来自客户端的请求;
Socket通常称作“套接字”,通常通过“套接字”向网络发出请求或者应答网络请求。)

服务端步骤:
1、创建套接字
2、将套接字绑定到一个本地地址和端口上。
3、将套接字设为监听模式,准备接受客户请求。
4、等待客户请求到来;当请求到来之后,接受连接请求,返回一个新的对应于此次连接的套接字。启动线程为当前的连接服务。
5、返回,等待另外一个客户请求。
6、关闭套接字

客户端步骤:
1、创建套接字。
2、向服务器发出连接请求。
3、和服务器端进行通信。
4、关闭套接字。

注意: 由于server和client都是接受一行数据,所以在发送数据的时候加 “\r\n” 结束符

ServerSocket示例

package com.lvyuanj.core.java;

import io.netty.util.CharsetUtil;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class PlainOioServer {

    private final static String END_COMMAND = "\r\n";
    
    private final static String RECEIPINFO ="ACKNOWLEDGE RECEIPT"+ END_COMMAND;

    public void initServer(int port) throws Exception {
        final ServerSocket socket = new ServerSocket(port);
        System.out.println("server start ......");
        while (true) {
            Socket clientSocket = socket.accept();
            System.out.println("Accepted connection from " + clientSocket);
            new Thread(new MyThread(clientSocket)).start();
        }
    }

    class MyThread implements Runnable {

        private Socket socket;

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

        @Override
        public void run() {
            try {
                InputStream in = socket.getInputStream();
                OutputStream out = socket.getOutputStream();

                BufferedReader reader = new BufferedReader(new InputStreamReader(in));
                String data = null;
                while ((data = reader.readLine()) != null) {
                    System.out.println("receipt "+socket.getInetAddress()+" client data:" + data);
                    out.write(RECEIPINFO.getBytes(CharsetUtil.UTF_8));
                    out.flush();
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) throws Exception {
        PlainOioServer plainOioServer = new PlainOioServer();
        plainOioServer.initServer(8899);
    }
}

client 示例:

package com.lvyuanj.core.java;

import java.io.*;
import java.net.Socket;

public class PlainOioClient {

    private final static String END_COMMAND = "\r\n";

    class ReceiptThread implements Runnable{

        private Socket socket;

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

        @Override
        public void run() {
            try {
                System.out.println("start client console listener:");
                //读取服务器返回的消息
                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                String str = null;
                while((str = br.readLine())!=null){    //阻塞式读取数据
                    writer.write(str+END_COMMAND);
                    writer.flush();

                    if("bye".equals(str)){
                        socket.close();
                        break;
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


    public static void main(String[] args){
        try{
            Socket socket = new Socket("127.0.0.1",8899);

            PlainOioClient plainOioClient = new PlainOioClient();
            ReceiptThread sendDataThread = plainOioClient.new ReceiptThread(socket);
            //从控制获取数据并发送服务器线程
            new Thread(sendDataThread).start();

            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String body;
            while((body = reader.readLine()) != null){
                System.out.println("receipt server data:"+body);
            }
        }catch (Exception e){
            e.printStackTrace();
        }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值