聊聊、Java 网络编程

  Socket 编程大家都不陌生,Java 学习中必学的部分,也是 Java网络编程核心内容之一。Java 网络编程又包括 TCP、UDP,URL 等模块。TCP 对应 Socket模块,UDP 对应 DatagramPacket 模块。URL 对应 URL 模块。其中 TCP 和 UDP 是网络传输协议,TCP 是数据流传输协议,UDP 是数据包传输协议。两者之间的异同就不在这里说了,推荐一本入门书籍 《TCPIP入门经典》。我们开始 Socket 服务端和客户端编程吧。

 

 一、【Socket 服务端】

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package www.rockcode.com.tnetty.server;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
 
/**
 * @author xums
 * SocketServer
 * TODO
 * 2017年5月4日-上午11:07:49
 */
public class SocketServer {
 
    public static void main(String[] args) {
         
        SocketServer server = new SocektServer();                server.init();
         
    }
     
    public void init(){
         
        ServerSocket serverSocket = null;
        Socket socket = null;
        BufferedReader br = null;
        PrintWriter pw = null;
        try {
            serverSocket = new ServerSocket(9999);
            socket = serverSocket.accept();
             
            br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            pw = new PrintWriter(socket.getOutputStream());
            String msg = br.readLine();
             
            while(null!=msg){
                System.out.println("收到消息:"+msg);
                msg = br.readLine();
            }
             
             
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            if(null!=pw){
                pw.close();
            }
             
            if(null!=br){
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
             
            if(null!=socket){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
     
}

  

 二、【Socket 客户端】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package www.rockcode.com.tnetty.client;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.Socket;
 
/**
 * @author xums
 * SocketClient
 * TODO
 * 2017年5月4日-上午10:47:20
 */
public class SocketClient {
     
    public static void main(String[] args) {
         
        SocketClient client = new SocketClient();
                client.init();
 
    }
 
         
    public void init(){
        Socket socket = null;
        BufferedReader br = null;
        PrintWriter pw = null;
        try {
            socket = new Socket();
            socket.connect(new InetSocketAddress(9999), 5000);
            socket.setKeepAlive(true);//默认false
             
            if(socket.isConnected()){
                 
                br = new BufferedReader(new InputStreamReader(System.in));
                pw = new PrintWriter(socket.getOutputStream(),true);//如果第二个参数不选择 true 或者 只选一个参数,那么发完消息要记得 flush()
                String msg = "";
                 
                while(true){
                     
                    boolean alive = socket.getKeepAlive();//判断服务端是否在线
                                             
                    if(!alive){
                        throw new Exception("服务端不在线!");
                    }else{
                        msg = br.readLine();
                        if(null!=msg){
                            System.out.println("发送消息:"+msg);
                            pw.println(msg);
                                                        //pw.flush();
                        }
                    }
                }
                 
            }
             
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }finally{
            if(null!=pw){
                pw.close();
            }
             
            if(null!=br){
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
             
            if(null!=socket){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
             
        }
    }
     
}

  Socket 编程是必须熟悉的知识点,即使现在有不少的开源通信框架出现,例如 Mina、Netty、Cindy 等等。现在商业上用的最多还是 Netty,从最原始的 Java IO 到 Java NIO,再到 Java AIO,再到 Netty 等。其底层离不开 Socket ,所有技术的更新和不断发展都是背后业务在驱动。人们追求高效率,高速度,高质量的通信,促使开源框架日新月异。关于开源通信框架以后再讲,和大家一起学习,谢谢大家观看!

 


  

posted @   香农随笔  阅读(460)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
· SQL Server统计信息更新会被阻塞或引起会话阻塞吗?
阅读排行:
· 本地部署 DeepSeek:小白也能轻松搞定!
· 传国玉玺易主,ai.com竟然跳转到国产AI
· 自己如何在本地电脑从零搭建DeepSeek!手把手教学,快来看看! (建议收藏)
· 我们是如何解决abp身上的几个痛点
· 如何基于DeepSeek开展AI项目
点击右上角即可分享
微信分享提示