Java 网络编程(五) 使用TCP/IP的套接字(Socket)进行通信

套接字Socket的引入

  为了能够方便地开发网络应用软件,由美国伯克利大学在Unix上推出了一种应用程序访问通信协议的操作系统用调用socket(套接字)

  socket的出现,使程序员可以很方便地访问TCP/IP,从而开发各种网络应用的程序。

  随着Unix的应用推广,套接字在编写网络软件中得到了极大的普及。后来,套接字又被引进了Windows等操作系统中。Java语言也引入了套接字编程模型。

什么是Socket?

  Socket是连接运行在网络上的两个程序间的双向通讯的端点。

使用Socket进行网络通信的过程

  服务器程序将一个套接字绑定到一个特定的端口,并通过此套接字等待和监听客户的连接请求。

  客户程序根据服务器程序所在的主机名和端口号发出连接请求。

  如果一切正常,服务器接受连接请求。并获得一个新的绑定到不同端口地址的套接字。(不可能有两个程序同时占用一个端口)。

  客户和服务器通过读写套接字进行通讯。

  使用ServerSocketSocket实现服务器端和客户端的Socket通信。

  

  其中:

  左边ServerSocket类的构造方法可以传入一个端口值来构建对象。

  accept()方法监听向这个socket的连接并接收连接。它将会阻塞直到连接被建立好。连接建立好后它会返回一个Socket对象。

  连接建立好后,服务器端和客户端的输入流和输出流就互为彼此,即一端的输出流是另一端的输入流。

总结:使用ServerSocket和Socket实现服务器端和客户端的Socket通信

  (1)建立Socket连接

  (2)获得输入/输出流

  (3)读/写数据

  (4)关闭输入/输出流

  (5)关闭Socket

通信程序测试

先看效果:

建立服务器端和客户端如下:

 1 package com.hjp.sockettest;
 2
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.net.Socket;
 6
 7 public class ServerInputThread extends Thread {
 8     private Socket socket;
 9
10     public ServerInputThread(Socket socket) {
11         super();
12         this.socket = socket;
13     }
14
15     @Override
16     public void run() {
17         try {
18             // 获得输入流
19             InputStream is = socket.getInputStream();
20
21             while (true) {
22                 byte[] buffer = new byte[1024];
23
24                 int length = is.read(buffer);
25
26                 String str = new String(buffer, 0, length);
27
28                 System.out.println(str);
29
30             }
31
32         } catch (IOException e) {
33             e.printStackTrace();
34         }
35     }
36
37 }
 1 package com.hjp.sockettest;
 2
 3 import java.io.BufferedReader;
 4 import java.io.IOException;
 5 import java.io.InputStreamReader;
 6 import java.io.OutputStream;
 7 import java.net.Socket;
 8
 9 public class ServerOutputThread extends Thread {
10     private Socket socket;
11
12     public ServerOutputThread(Socket socket) {
13         super();
14         this.socket = socket;
15     }
16
17     @Override
18     public void run() {
19         try {
20
21             OutputStream os = socket.getOutputStream();
22
23             while (true) {
24                 BufferedReader reader = new BufferedReader(
25                         new InputStreamReader(System.in));
26
27                 String line = reader.readLine();
28
29                 os.write(line.getBytes());
30             }
31         } catch (IOException e) {
32             e.printStackTrace();
33         }
34
35     }
36
37 }
 1 package com.hjp.sockettest;
 2
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.net.Socket;
 6
 7 public class ClientInputThread extends Thread {
 8     private Socket socket;
 9
10     public ClientInputThread(Socket socket) {
11         super();
12         this.socket = socket;
13     }
14
15     @Override
16     public void run() {
17         try {
18             // 获得输入流
19             InputStream is = socket.getInputStream();
20
21             while (true) {
22                 byte[] buffer = new byte[1024];
23
24                 int length = is.read(buffer);
25
26                 String str = new String(buffer, 0, length);
27
28                 System.out.println(str);
29
30             }
31
32         } catch (IOException e) {
33             e.printStackTrace();
34         }
35     }
36
37 }
 1 package com.hjp.sockettest;
 2
 3 import java.io.BufferedReader;
 4 import java.io.IOException;
 5 import java.io.InputStreamReader;
 6 import java.io.OutputStream;
 7 import java.net.Socket;
 8
 9 public class ClientOutputThread extends Thread {
10     private Socket socket;
11
12     public ClientOutputThread(Socket socket) {
13         super();
14         this.socket = socket;
15     }
16
17     @Override
18     public void run() {
19         try {
20
21             OutputStream os = socket.getOutputStream();
22
23             while (true) {
24                 BufferedReader reader = new BufferedReader(
25                         new InputStreamReader(System.in));
26
27                 String line = reader.readLine();
28
29                 os.write(line.getBytes());
30             }
31         } catch (IOException e) {
32             e.printStackTrace();
33         }
34
35     }
36
37 }
 1 package com.hjp.sockettest;
 2
 3 import java.net.ServerSocket;
 4 import java.net.Socket;
 5
 6 public class MainServer {
 7     public static void main(String[] args) throws Exception {
 8         ServerSocket serverSocket = new ServerSocket(4000);
 9
10         while (true) {
11             // 一直处于监听状态,这样可以处理多个用户
12             Socket socket = serverSocket.accept();
13
14             // 启动读写线程
15             new ServerInputThread(socket).start();
16             new ServerOutputThread(socket).start();
17
18         }
19
20     }
21
22 }
 1 package com.hjp.sockettest;
 2
 3 import java.net.Socket;
 4
 5 public class MainClient {
 6
 7     public static void main(String[] args) throws Exception {
 8         Socket socket = new Socket("127.0.0.1", 4000);
 9
10         new ClientInputThread(socket).start();
11         new ClientOutputThread(socket).start();
12
13     }
14 }

原文地址:https://www.cnblogs.com/huangjianping/p/8325750.html

时间: 2024-07-31 05:54:06

Java 网络编程(五) 使用TCP/IP的套接字(Socket)进行通信的相关文章

从零探索Java网络编程01之 TCP/IP 与 Socket

最近完成了几项比较简单的项目, 日子有些松散, 终于是在996里偷了点闲暇时光, 想着来研究研究些啥吧?  一个普通的控制台日志映入了我的眼帘(孽缘呀): (图中使用 SpringBoot 的 log4j 来输出日志, logginglevel: debug, jdk版本为1.8) 造成这种现象的原因可能是, Mybatis在执行接口方法时, 实例化了多个Preparedstatement, 启用了不同的NIO线程, 但是其中, 咦?! 没错, NIO中出了一段IO!!! (天哪!), 在查询网

Android网络编程系列 一 TCP/IP协议族

在学习和使用Android网路编程时,我们接触的仅仅是上层协议和接口如Apache的httpclient或者Android自带的httpURlconnection等等.对于这些接口的底层实现我们也有必要进一步的了解,这就要我们了解网络通信层了,提到网络通信层不得不说起ISO-OSI的七层协议经典架构,如图所示: 上图的左边部分就是osi架构模型了, ISO/OSI模型,即开放式通信系统互联参考模型(Open System Interconnection Reference Model),是国际标

Linux程序设计学习笔记----Socket网络编程基础之TCP/IP协议簇

转载请注明出处: ,谢谢! 内容提要 本节主要学习网络通信基础,主要涉及的内容是: TCP/IP协议簇基础:两个模型 IPv4协议基础:IP地址分类与表示,子网掩码等 IP地址转换:点分十进制\二进制 TCP/IP协议簇基础 OSI模型 我们知道计算机网络之中,有各种各样的设备,那么如何实现这些设备的通信呢? 显然是通过标准的通讯协议,但是,整个网络连接的过程相当复杂,包括硬件.软件数据封包与应用程序的互相链接等等,如果想要写一支将联网全部功能都串连在一块的程序,那么当某个小环节出现问题时,整只

用java网络编程中的TCP方式上传文本文件及出现的小问题

自己今天刚学java网络编程中的TCP传输,要用TCP传输文件时,自己也是遇到了一些问题,抽空把它整理了一下,供自己以后参考使用. 首先在这个程序中,我用一个客户端,一个服务端,从客户端上传一个文本文件给服务端,服务端接收数据并显示“上传成功”给客户端. 客户端: 1 import java.io.BufferedReader; 2 import java.io.FileReader; 3 import java.io.IOException; 4 import java.io.InputStr

Android网络编程系列 一 TCP/IP协议族之网际层

这篇借鉴的文章主要是用于后续文章知识点的扩散,在此特作备份和扩散学习交流. 网际层包括:IP.ICMP.IGMP 以及处在网际层实际工作在链路层的 ARP 和 RARP等等协议. 1.IP协议 互联网上的每个接口必须有一个唯一的Internet地址(也称作IP地址).IP地址长32 bit.IP协议是TCP/IP协议的核心,所有的TCP,UDP,ICMP,IGMP的数据都以IP数据格式传输.要注意的是,IP不是可靠的协议,这是说,IP协议没有提供一种数据未传达以后的处理机制--这被认为是上层协议

Android网络编程系列 一 TCP/IP协议族之链路层

这篇借鉴的文章主要是用于后续文章知识点的扩散,在此特作备份和扩散学习交流. 数据链路层有三个目的: 为IP模块发送和 接收IP数据报. 为ARP模块发送ARP请求和接收ARP应答. 为RARP发送RARP请 求和接收RARP应答 ip大家都听说过.至于ARP和RARP,ARP叫做地址解析协议,是用IP地址换MAC地址的一种协议,而RARP则叫做逆地址解析协议,在tcp/ip协议的后面章节会介绍它们(在局域网里面用ARP协议可以很容易的搞瘫痪网络哦) 数据链路层的协议还是很多的,有我们最常用的以太

Linux 系统应用编程——网络编程(利用TCP/IP 模型分析数据传输过程)

TCP/IP参考模型是一个非常基础,而且也非常重要的基础框架,要想入门数通这是个必须掌握的基本概念,本文档通过一个简单的示例,结合参考模型来分析一下数通的基本过程. 网络环境非常简单,如下图所示,我们现在来分析一下PC去访问Webserver的WEB服务,整个数据通信过程是如何发生的,为了简化描述,我们这里暂时忽略DNS.ARP.帧校验等等机制的工作细节,只考虑较为宏观的层面. 1)PC访问WebServer的WEB服务,实际上是访问Webserver的HTTP服务.这个过程对于人来说,就是在P

【Linux 网络编程】常用TCP/IP网络编程函数

(1)函数socket 1 /**************************************************************** 2 ** 功能:创建一个套接字用于通信 3 ** 参数:domain 指定通信协议族 4 ** type 指定socket类型,流式套接字 SOCK_STREAM 5 ** 数据报套接字 SOCKDGRAM 6 ** 原始套接字 SOCKRAW 7 ** protocol 协议类型 (习惯上填写0) 8 ** 返回值:成功返回非负整数,它

Java网络编程从入门到精通(18):Socket类的getter和setter方法(2)

二.用于获得和设置Socket选项的getter和setter方法 Socket选择可以指定Socket类发送和接受数据的方式.在JDK1.4中共有8个Socket选择可以设置.这8个选项都定义在java.net.SocketOptions接口中.定义如下: public final static int TCP_NODELAY = 0x0001;    public final static int SO_REUSEADDR = 0x04;    public final static int