JJJJJava-socket通信

网络编程主要问题

  • 如何准确的定位网络上一台或多台主机
  • 找到主机后如何可靠高效的进行数据传输
    在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机。
    而TCP层则提供面向应用的可靠(tcp)的或非可靠(UDP)的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的。

两类传输协议:TCP;UDP

  • TCP:面向连接的 安全的
  • TCP是Tranfer Control Protocol的 简称,是一种面向连接的保证可靠传输的协议。通过TCP协议传输,得到的是一个顺序的无差错的数据流。发送方和接收方的成对的两个socket之间必须建 立连接,以便在TCP协议的基础上进行通信,当一个socket(通常都是server socket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket连接起来,它们就可以进行双向数据传输,双方都可以进行发送 或接收操作
  • UDP:面向无连接的 不安全 但快
  • UDP是User Datagram Protocol的简称,是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的

基于Socket的java网络编程

Socket类:客户端
ServerSocket:服务器端
TCP通信中,服务端与客户端是一对多的关系

服务端与客户端的关系.png

什么是Socket

  • 网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定
  • 但是,Socket所支持的协议种类也不光TCP/IP一种,因此两者之间是没有必然联系的。在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程

Socket通讯的过程

Server端Listen(监听)某个端口是否有连接请求,Client端向Server 端发出Connect(连接)请求,Server端向Client端发回Accept(接受)消息。一个连接就建立起来了。Server端和Client 端都可以通过Send,Write等方法与对方通信
对于一个功能齐全的Socket,都要包含以下基本结构,其工作过程包含以下四个基本的步骤:

  • 创建Socket
  • 打开连接到Socket的输入/出流
  • 按照一定的协议对Socket进行读/写操作
  • 关闭Socket

创建Socket

java在包java.net中提供了两个类Socket和ServerSocket,分别用来表示双向连接的客户端和服务端。这是两个封装得非常好的类,使用十分方便

  • 注意,在选择端口时,必须小心。每一个端口提供一种特定的服务,只有给出正确的端口,才 能获得相应的服务。0~1023的端口号为系统所保留,例如http服务的端口号为80,telnet服务的端口号为23,ftp服务的端口号为21, 所以我们在选择端口号时,最好选择一个大于1023的数以防止发生冲突
  • 在创建socket时如果发生错误,将产生IOException,在程序中必须对之作出处理。所以在创建Socket或ServerSocket是必须捕获或抛出例外

数据输出与读取

数据.png

demo.手动发送内容并输出

class MyClient{
    public static void main(String[] args){
        //连接服务器段的socket
        Socket socket = null;
        try {
            socket = new Socket("10.129.12.158", 8888);
            //接收服务器消息
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String line = null;
            while ((line = br.readLine()) != null){
                System.out.println(line);
            }
        }catch (IOException e){
            System.out.println("网络出错 请重新登录");
        }finally {
            //关闭连接
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

class MyServer{
    public static void main(String[] args){
        //创建ServerSocket
        try {
            ServerSocket ss = new ServerSocket(8888);
            //监听客户端的连接
            Socket socket = ss.accept();

            //从终端接收数据
            BufferedReader keyin = new BufferedReader(new InputStreamReader(System.in));
            //获取向客户端输出数据的输出流
            PrintStream ps = new PrintStream(socket.getOutputStream());
            String line = null;

            while ((line = keyin.readLine()) != null){
                //发送给客户端
                ps.println(line);
            }

            //发送给客户端

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

PS.

慢慢我们学习的东西开始逐渐融合了,今天学习网络用到了以前的多线程与I/O流等等,感觉到了吃力,但也让我能够更清楚的了解到自己哪方面的不足,加上今天的四级成绩有点身心俱疲的感觉,不过还是要咬牙坚持。我不希望以后某个时间点会后悔,因为让我们后悔情绪的本质是因为我们对自身实力过于高估从而不够自律和努力造成的,加油吧


开炮.jpg

你可能感兴趣的:(JJJJJava-socket通信)