基于java的socket编程 - Go语言中文社区

基于java的socket编程


https://www.cnblogs.com/liusxg/p/3917624.html

socket编程:

一:什么是socket:socket是BSD UNIX的通信机制,通常称为“套接字”,其英文原意是“孔”或“插座”。有些顾名思义,socket正如其英文原意一样,像是一个多孔插座,可以提供多个端口的连接服务。

为了更加直观的了解socket,可以用插座来比喻socket。

如果说socket是一个多孔插座,插座是提供各种电器供电的地方,不同的电器工作时需要的电压和电流也不一样,但各种电器都有各自的一个插口,这个称之为“端口”。电器使用的电可以看做是网络资源或者是各种“流”,电是由电线传输过来的,所以插座需要连接电线,这里电线也就是服务器和客户端连接 “connection”。 其中初始化socket的过程像是买来一个插座的安装过程。

在插座这边的是“客户端”,电线那边提供电的发电厂是“服务器”。客户端和发电厂都各自拥有一个地址,即“IP地址”。其中还有一套传输和用电的规则,比如传输电时需要的电线多少伏才能满足需求,电器用电的技术参数,端口是几个孔的。这个是“协议”。正常情况下我们是不会去管协议的内容是什么,也就是说协议在我们面前是隐藏的。

在这里插入图片描述
二.工作原理:对于服务器来说,服务器先初始化socket,然后端口绑定(bind),再对端口监听(listen),调用accept阻塞,等待客户端连接请求。对于客户端来说,客户端初始化socket,然后申请连接(connection)。客户端申请连接,服务器接受申请并且回复申请许可(这里要涉及TCP三次握手连接),然后发送数据,最后关闭连接,这是一次交互过程。
在这里插入图片描述
客户端Client源码如下:

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

public class Client {

    public static void main(String[] args) throws Exception {
        // TODO 自动生成的方法存根
        
        String readline = null;
        String inTemp = null;
        //String outTemp = null;
        String turnLine = "n";
        final String client = "Client:";
        final String server = "Server:";
        
        int port = 4000;
        byte ipAddressTemp[] = {127, 0, 0, 1};
        InetAddress ipAddress = InetAddress.getByAddress(ipAddressTemp);
        
        //首先直接创建socket,端口号1~1023为系统保存,一般设在1023之外
        Socket socket = new Socket(ipAddress, port);
        
        //创建三个流,系统输入流BufferedReader systemIn,socket输入流BufferedReader socketIn,socket输出流PrintWriter socketOut;
        BufferedReader systemIn = new BufferedReader(new InputStreamReader(System.in));
        BufferedReader socketIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintWriter socketOut = new PrintWriter(socket.getOutputStream());
        
        while(readline != "bye"){
            
            System.out.println(client);
            readline = systemIn.readLine();
            //System.out.println(readline);
            
            socketOut.println(readline);
            socketOut.flush();    //赶快刷新使Server收到,也可以换成socketOut.println(readline, ture)
            
            //outTemp = readline;
            inTemp = socketIn.readLine();
            
            //System.out.println(client + outTemp);
            System.out.println(server + turnLine + inTemp);
            
        }
        
        systemIn.close();
        socketIn.close();
        socketOut.close();
        socket.close();
        
    }

}

服务器Server源码如下:


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


public class Server {

    public static void main(String[] args) throws Exception {
        // TODO 自动生成的方法存根
        
        String readline = null;
        String inTemp = null;
        //String outTemp = null;
        String turnLine = "n";
        final String client = "Client:";
        final String server = "Server:";
        
        int port = 4000;
        //byte ipAddressTemp[] = {127, 0, 0, 1};
        //InetAddress ipAddress = InetAddress.getByAddress(ipAddressTemp);
        
        //首先直接创建serversocket
        ServerSocket serverSocket = new ServerSocket(port);  
        
     //调用服务器的accept()进行阻塞(程序会在这等待),当有申请连接时会打开阻塞并返回一个socket
        Socket socket = serverSocket.accept();
        
        //创建三个流,系统输入流BufferedReader systemIn,socket输入流BufferedReader socketIn,socket输出流PrintWriter socketOut;
        BufferedReader systemIn = new BufferedReader(new InputStreamReader(System.in));
        BufferedReader socketIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintWriter socketOut = new PrintWriter(socket.getOutputStream());
        
        while(readline != "bye"){
            
            inTemp = socketIn.readLine();
            System.out.println(client + turnLine + inTemp);
            System.out.println(server);
            
            readline = systemIn.readLine();
            
            socketOut.println(readline);
            socketOut.flush();    //赶快刷新使Client收到,也可以换成socketOut.println(readline, ture)
            
            //outTemp = readline;
            
            //System.out.println(server);
            
        }
        
        systemIn.close();
        socketIn.close();
        socketOut.close();
        socket.close();
        serverSocket.close();
        
    }

}

在这里插入图片描述

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/junjunba2689/article/details/82778435
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-02-25 00:15:40
  • 阅读 ( 1220 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢