Socket编程(三)★

★Sockets 使用TCP协议实现网络通信的Socket相关类(重点)

TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议

服务器端的ServerSocket类        客户端的Socket类

①.服务器端通信流程                                                           ②. 客户端通信流程

   1. 创建ServerSocket对象,绑定该程序使用的端口                  1. 创建Socket对象,指明服务器的IP地址和通信程序的端口号                              

   2. 建立accept()方法监听客户端请求                                     2.  建立链接后,通过输出流向服务器发送请求连接。

   3. 建立连接后,通过输入流读取客户端放送的请求信息               3. 通过输入流获得服务器的响应信息。

   4. 通过输出流向客户端发送响应信息                                          4. 重复2,3

   5. 重复3,4                                                                              5. 关闭相关资源

   6. 关闭相关资源

注意: 我的示例代码客户端和服务器都是本机

一. TCP基础的C/S通信

     示例代码省略了客户端重复发送请求的步骤

     示例代码:

   服务器端

 1 public static void main(String[] args) {
 2         try {
 3             //1.创建一个服务器端Socket,即ServerSicket,指定绑定端口,并监听此端口
 4             ServerSocket serverSocket = new ServerSocket(888);
 5             System.out.println("***服务器即将启动,等待客户端的连接***");
 6             //2.通过accept()方法监听客户端请求,若接到请求服务器会返回一个socket对象进行通信
 7             Socket socket = serverSocket.accept();
 8             //3.建立连接后,通过输入流读取客户端发送的信息
 9             InputStream is = socket.getInputStream();//获取资源的字节输入流
10             InputStreamReader isr = new InputStreamReader(is);//字节输入流转字符输入流
11             BufferedReader buffer = new BufferedReader(isr);//为字符输入流添加缓冲
12             String info = null;
13             while((info = buffer.readLine()) != null){
14                 System.out.println("客户端发送的信息:" + "\n" + info + "\n");
15             }
16             socket.shutdownInput();//关闭输入流
17             //4.通过输出流向客户端放送相应信息
18             OutputStream os = socket.getOutputStream();//获取字节输出流
19             PrintWriter pw = new PrintWriter(os);//将输出流打包为打印流
20             pw.write("欢迎您!\n");
21             pw.flush();//刷新
22             socket.shutdownOutput();//关闭输出流
23             //5.关闭资源
24             pw.close();
25             os.close();
26             buffer.close();
27             isr.close();
28             is.close();
29             socket.close();
30             serverSocket.close();
31         } catch (IOException e) {
32             e.printStackTrace();
33         }
34     }

客户端:

 1 public static void main(String[] args) {
 2         try {
 3             //1.创建Socket对象,指明需要连接的服务器地址和端口号
 4             Socket socket = new Socket("localhost",888);
 5             //2.链接后通过输出流向服务器端放送请求信息
 6             OutputStream os = socket.getOutputStream();
 7             PrintWriter pw = new PrintWriter(os);
 8             pw.write("用户名:admin;密码:4399");
 9             pw.flush();//刷新
10             socket.shutdownOutput();//关闭输出流
11             //3.通过输出流获取服务器响应的信息
12             InputStream is = socket.getInputStream();
13             InputStreamReader isr = new InputStreamReader(is);
14             BufferedReader buffer = new BufferedReader(isr);
15             String info = null;
16             while((info = buffer.readLine()) != null){
17                 System.out.println(info);
18             }
19             socket.shutdownInput();//关闭输入流
20             //4.关闭相关资源
21             buffer.close();
22             isr.close();
23             is.close();
24             pw.close();
25             os.close();
26             socket.close();
27         } catch (UnknownHostException e) {
28             e.printStackTrace();
29         } catch (IOException e) {
30             e.printStackTrace();
31         }
32     }

输出结果

1.开始。服务器端:

***服务器即将启动,等待客户端的连接***

服务器运行带accept()方法,处于阻塞状态,等待客户端发送信息响应连接

2.建立链接后。服务器端:                          客户端:

***服务器即将启动,等待客户端的连接***                   欢迎您!
客户端发送的信息:
用户名:admin;密码:4399

      

实际就是ServerSocket的accept()方法监测到客户端的请求之后生成一个服务器的Scoket对象

实际就是两个Scoket对象在进行通信   Socket = IP地址 + 端口号

二. 进阶版,多线程TCP的C/S通信

      上诉例子只实现了一台服务器和一台客户机的通信,但实际情况通常都是一台服务器对应多个客户端的情况,要解决这个方法,我们引用了线程。

      示例代码:(客户端代码不变)

      客户端:

 1 public static void main(String[] args) {
 2         try {
 3             //创建一个服务器端Socket,即ServerSicket,指定绑定端口,并监听此端口
 4             ServerSocket serverSocket = new ServerSocket(888);
 5             System.out.println("***服务器即将启动,等待客户端的连接***");
 6             Socket socket = null;
 7             //通过accept()方法循环监听客户端请求,若接到请求服务器会返回一个socket对象进行通信
 8             while(true){
 9                  socket = serverSocket.accept();
10                  ServerThread serverThread = new ServerThread(socket);
11                  serverThread.start();
12                  System.out.println("客户端" + socket.getInetAddress().getHostAddress() + "说:");
13             }
14         } catch (IOException e) {
15             e.printStackTrace();
16         }
17     }
 1 public class ServerThread extends Thread {
 2
 3     Socket socket = null;
 4
 5     public ServerThread(Socket socket){
 6         this.socket = socket;
 7     }
 8
 9     public void run(){
10         InputStream is = null;
11         InputStreamReader isr = null;
12         BufferedReader buffer = null;
13         OutputStream os = null;
14         PrintWriter pw = null;
15         try {
16             //建立连接后,通过输入流读取客户端发送的信息
17             is = socket.getInputStream();
18             isr = new InputStreamReader(is);
19             buffer = new BufferedReader(isr);
20             String info = null;
21             while((info = buffer.readLine()) != null){
22                 System.out.println( info + "\n");
23             }
24             socket.shutdownInput();//关闭输入流
25             //通过输出流向客户端放送相应信息
26             os = socket.getOutputStream();
27             pw = new PrintWriter(os);
28             pw.write("欢迎您!\n");
29             pw.flush();//刷新
30             socket.shutdownOutput();//关闭输出流
31         } catch (IOException e) {
32             e.printStackTrace();
33         } finally{
34             //关闭资源
35             try {
36                 if(pw != null)
37                     pw.close();
38                 if(os != null)
39                     os.close();
40                 if(buffer != null)
41                     buffer.close();
42                 if(isr != null)
43                     isr.close();
44                 if(is != null)
45                     is.close();
46                 if(socket != null)
47                     socket.close();
48             } catch (IOException e) {
49                 // TODO Auto-generated catch block
50                 e.printStackTrace();
51             }
52         }
53     }
54 }

运行结果:

***服务器即将启动,等待客户端的连接***
客户端127.0.0.1说:
用户名:admin;密码:4399

客户端127.0.0.1说:
用户名:xiaolai;密码:1104

这里其实是有两个客户端与服务器进行了响应,因为两个客户端都是我的本机,所以IP地址会相同。

运用一个死循环执行accept()语句。

只要有客户端发送请求,服务器就会生成一个Socket对象,开启线程与一个客户端通信,

多个客户端发送请求,服务器就会不停的切换生成Socket对象,并开启线程进行通信

从而实现了一个服务器通过多线程的方法与数台客户机通信。

 如果有什么错误,或者我理解错误或不当的,恳请大家纠正,谢谢!嘻嘻嘻~

时间: 2024-10-08 20:20:31

Socket编程(三)★的相关文章

IP地址的三种表示格式及在Socket编程中的应用

转自:http://blog.csdn.net/hguisu/article/details/7449955 使用TCP/IP协议进行网络应用开发的朋友首先要面对的就是对IP地址信息的处理.IP地址其实有三种不同的表示格式:  1)Ascii(网络点分字符串)-        2) 网络地址(32位无符号整形,网络字节序,大头)        3)主机地址 (主机字节序)   IP地址是IP网络中数据传输的依据,它标识了IP网络中的一个连接,一台主机可以有多个IP地址,IP分组中的IP地址在网络

Python 基础之socket编程(三)

python 基础之socket编程(三) 前面实现的基于socket通信只能实现什么呢?在tcp协议的通信中就是一个用户说一句,服务端给你回一句,你再给服务端说一句,服务端再给你回一句,就这样一直友好的玩耍下去了.等等,又有一个用户来了,他呢也想和和服务端进行一下交流,于是他就给服务端发送了一条消息,之后等呀等不知过了多久,任然没有等到服务端给他发挥的消息,只有什么时候他就可以和服务端愉快的玩耍了呢?这个就需要第一个用户退出和服务器的链接,此时第二个客户端才会和服务端建立起链接,此时此刻,他才

简单服务器开发(三)Socket 编程

Socket 的英文原义是“孔”或“插座”.通常也称作"套接字",用于描述 IP 地址和端口,可以用来实现不同计算机之间的通信.在 Internet 上的主机一般运行了多个服务软件,同时提供几种服务.每种服务都打开一个 Socket,并绑定到一个端口上,不同的端口对应于不同的服务. 根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认.第一步:服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,

iOS开发——网络编程OC篇&Socket编程

Socket编程 一.网络各个协议:TCP/IP.SOCKET.HTTP等 网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 其中物理层.数据链路层和网络层通常被称作媒体层,是网络工程师所研究的对象: 传输层.会话层.表示层和应用层则被称作主机层,是用户所面向和关心的内容. http协议   对应于应用层 tcp协议    对应于传输层 ip协议     对应于网络层 三者本质上没有可比性.  何况HTTP协议是基于TCP连接的. TCP/IP是传输层协议,主要

Linux Socket编程-(转自吴秦(Tyler))

"一切皆Socket!" 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. --有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket?那什么是socket?socket的类型有哪些?还有socket的基本函数,这些都是本文想介绍的.本文的主要内容如下: 1.网络中进程之间如何通信?

Python Socket 编程——聊天室演示样例程序

上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和client的代码了解主要的 Python Socket 编程模型.本文再通过一个样例来加强一下对 Socket 编程的理解. 聊天室程序需求 我们要实现的是简单的聊天室的样例,就是同意多个人同一时候一起聊天.每一个人发送的消息全部人都能接收到,类似于 QQ 群的功能,而不是点对点的 QQ 好友之间的聊天.例如以下图: 图来自:http://www.ibm.com/developerworks/linux/tu

读懂Java中的Socket编程(转)

Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP的Socket编程,并且如何写一个客户端/服务器程序. 餐前甜点 Unix的输入输出(IO)系统遵循Open-Read-Write-Close这样的操作范本.当一个用户进程进行IO操作之前,它需要调用Open来指定并获取待操作文件或设备读取或写入的权限.一旦IO操作对象被打开,那么这个用户进程可以对这个

(转)Java Socket编程

原文出自:http://www.cnblogs.com/rocomp/p/4790340.html Socket是网络驱动层提供给应用程序编程接口和一种机制.可以把Socket比喻成一个港口码头,应用程序只要把货物放到港口码头上,就算完成了货物的运送.对于接收方应用程序也要创建一个港口码头,只需等待货物到达码头后将货物取走. InetAddress          InetAddress类用于标识网络上的硬件资源,标识互联网协议(IP)地址.           该类没有构造方法       

Python Socket编程

因需要做一个监测TCP数据内容的小插件,学习了局域网内部的封装好的传输软件Socket: 一.Socket的简介如下: 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. 建立网络通信连接至少要一对端口号(socket).socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员 做网络开发所用的接口,这就是Socket编程接口:HTTP是轿车,提供了封装或者显示数据的具体形式:Socket是发动机, 提供了网络通信的能力.

C#版 Socket编程(最简单的Socket通信功能)

原文://http://blog.csdn.net/linybo/article/details/51141960 示例程序是同步套接字程序,功能很简单,只是客户端发给服务器一条信息,服务器向客户端返回一条信息:这里只是一个简单的示例,是一个最基本的socket编程流程,在接下来的文章中,会依次记录套接字的同步和异步,以及它们的区别. 第一步:用指定的端口号和服务器的ip建立一个EndPoint对像: 第二步:建立一个Socket对像: 第三步:用socket对像的Bind()方法绑定EndPo