Java Socket编程(二) TCP编程

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

       TCP协议是面向连接的、可靠的、有序的、以字节流的方式发送数据,通过 三次握手 的方式建立连接,形成传输数据的通道,在连接中进行大量数据的传输,效率会稍低。

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

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

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

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

     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();
        
    }
}

 

        先运行客户端,然后运行服务端的话就会报错!很好理解,如果你没有服务端,客户端去连接谁呢?
        先运行服务端,再运行客户端,我们就能得到从客户端发往服务端的信息了

 

附:

 

 想继续深入可以看下下面这篇文章。转自itliucheng

使用Socket实现简单的聊天室

posted @ 2018-09-11 13:28  八稻  阅读(250)  评论(0编辑  收藏  举报