服务       上一章节提到了TCP协议的相关内容。下面使用TCP在服务端及客户端之间进行传递消息。

 三次握手 的方式建立连接,形成传输数据的通道,在连接中进行大量数据的传输,效率会稍低。

       Java中基于TCP协议实现网络通信的类有

              Socket类(客户端使用):当客户端程序需要从服务端端获取信息及其他服务时,应创建一个Socket对象

              ServerSocket(服务端使用):一般用于服务端设置端口号和进行监听

       真正进行通信的其实是客户端的Socket和服务端的Socket.

Java用TCP发送消息空指针异常 java发送tcp请求_Java用TCP发送消息空指针异常

     Socket通信的步骤



                 ① 创建ServerSocket和Socket



 



                 ② 打开连接到Socket的输入/输出流



 



                 ③ 按照协议对Socket进行读/写操作



 



                 ④ 关闭输入输出流、关闭Socket



 



      服务器端:



 



                 ① 创建ServerSocket对象,绑定监听端口



 



                 ② 通过accept()方法监听客户端请求



 



                 ③ 连接建立后,通过输入流读取客户端发送的请求信息



 



                 ④ 通过输出流向客户端发送相应信息



 



                 ⑤ 关闭相关资源



package test;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;



public class SocketServer {
    public static void main(String[] args) throws Exception {
        int port = 55521;//指定端口
        ServerSocket server = new ServerSocket(port);//ServerSocket用于服务器端socket,指定绑定的端口,并监听此端口
        System.out.println("等待连接");
        
        Socket socket = server.accept();//调用accept()方法开始监听,等待客户端的连接
        
        InputStream inputStream = socket.getInputStream();//建立好连接,从socket中获取输入流
        InputStreamReader isr = new InputStreamReader(inputStream,"UTF-8");
        BufferedReader br = new BufferedReader(isr);//建立缓冲,提高效率
        
        String info = null;
        while((info = br.readLine()) != null) {
            System.out.println("Server on:" + info);
        }
        socket.shutdownInput();
        OutputStream os = socket.getOutputStream();
        PrintWriter pw = new PrintWriter(os);//PrintWriter 是字符类型的打印输出流
        pw.write("欢迎您!你好");
        pw.flush();
        
        pw.close();
        os.close();
        isr.close();
        inputStream.close();
        server.close();
        socket.close();
        
    }
}



          客户端



                 ① 创建Socket对象,指明需要连接的服务器的地址和端口号



                 ② 连接建立后,通过输出流想服务器端发送请求信息



                 ③ 通过输入流获取服务器响应的信息



                 ④ 关闭响应资源  



package test;

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


public class SocketClient {
    public static void main(String[] args) throws Exception {
        String host = "127.0.0.1";
        int port = 55521;
        
        Socket socket = new Socket(host,port);
        
        OutputStream outputStream = socket.getOutputStream();
        PrintWriter pw = new PrintWriter(outputStream);
        pw.write("用户名:admin 密码:123");
        pw.flush();
        socket.shutdownOutput();
        
    
        
        InputStream inputStream = socket.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
        
        String info = null;
        while((info = br.readLine()) != null) {
            System.out.println("从服务端获取的消息:" + info);
        }

        br.close();
        inputStream.close();
        outputStream.close();
        socket.close();
        pw.close();
        
    }
}



 



        先运行客户端,然后运行服务端的话就会报错!很好理解,如果你没有服务端,客户端去连接谁呢?

Java用TCP发送消息空指针异常 java发送tcp请求_网络_02


        先运行服务端,再运行客户端,我们就能得到从客户端发往服务端的信息了


Java用TCP发送消息空指针异常 java发送tcp请求_java_03