IP地址标识Internet上的计算机,端口号标识正在计算机上运行的进程(程序)。端口号与IP地址的组合得出一个网络套接字(Socket),端口号被规定为一个16的整数0~65535。其中0~1023被预先定义的服务通信占用(如telnet占用端口23,http占用端口80等)。除非我们需要访问这些特定服务,否则就应该使用1024~65535这些端口中的某一个进行通信,以免发生端口冲突。当两个程序需要通信时,它们可以通过使用Socket类建立套接字对象并连接在一起。比如,有人让你去“中山广场邮局”,你可能反问“我去做什么”,因为他没告诉你“端口”,你不知道去处理何种业务。他说“中山广场邮局,8号窗口”,那么你到达地址“中山广场邮局”,找到“8号窗口”,就知道8号窗口处理特快专递业务,而且必须有个先决条件,就是你到达“中山广场邮局8号窗口”,该窗口必须有一位业务员在等待客户,否则就无法建立通信业务。
1.套接字连接
所谓套接字连接,就是客户端的套接字对象和服务器端的套接字对象通过输入输出流连接在一起,现在我们分3个步骤来说明套接字连接的基本模式。
①服务器建立ServerSocket对象。
ServerSocket对象负责等待客户端请求建立套接字连接,类似邮局某个窗口的业务员。也就是说,服务器必须事先建立一个等待客户请求(什么请求呢?建立套接字连接的请求) 的ServerSocket对象,ServerSocket的否则方法如下:
ServerSocket(int port)
port是一个端口号,port必须和客户请求的端口号相同。
当建立服务器套接字时可能发生IOException异常,因此要想下面那样建立接受客户的服务器套接字。
try { ServerSocket waitSocketConnection = new ServerSocket(PORT); } catch (IOException e) { e.printStackTrace(); }
当服务器的ServerSocket对象waitSocketConnection建立后,就可以使用方法accept()接收客户端的套接字连接请求,如下所示:
waitSocketConnection.accept();
接收客户端的套接字也可能发生IOException异常,因此要像下面那样建立接收客户端的套接字 :
try { Socket socketAtServer = waitSocketConnection.accept(); } catch (IOException e) { e.printStackTrace(); }
所谓接收客户的套接字请求,就是accept()方法会返回一个Socket对象socketAtServer(服务器端的套接字对象)。但是,accept()方法不会立刻返回,该方法会堵塞服务器端当前线程的执行,知道有客户端请求建立套接字连接。也就是说,如果没有客户请求建立套接字连接,那么下述代码中的“System.out.println("ok");”总不会被执行:
try { Socket socketAtServer = waitSocketConnection.accept(); System.out.println("ok"); } catch (IOException e) { e.printStackTrace(); }
注:ServerSocket对象可以调用setSoTimeout(int timeout)方法设置超时值(单位是毫秒),timeout是一个正直。当ServerSocket对象调用accept()方法堵塞的时间一旦超过timeout时,将触发SocketTimeoutException。
②客户端创建Socket对象。
客户端程序可以使用Socket类创建对象,Socket的构造方法如下:
socket(String host, int port)
参数host是服务器的IP地址,port是一个端口号。
创建Socket对象可能发生IOException异常,因此要像下面那样建立到服务器的套接字连接:
try { Socket socketAtClient = new Socket("localhost", 4431); } catch (Exception e) { e.printStackTrace(); }
客户端建立socketAtClient对象的过程就是向服务器端发出套接字连接请求,如果服务器端相应的端口上有ServerSocket对象正在使用accept()方法等待客户,那么双方的套接字对象socketAtClient和socketAtServer就都诞生了。
也可以使用Socket类不带参数的构造方法
public Socket()
创建一个套接字对象,该对象不请求任何连接。该对象再调用
public void connect(SocketAddress endpoint) throws IOException
请求与参数SocketAddress指定地址的套接字建立连接。为了使用connect()方法,可以使用SocketAddress的子类InetSocketAddress创建一个对象。InetSocketAddress的构造方法如下:
public InetSocketAddress(InetAddress addr, int port);
③流连接。
客户端和服务器端的套接字对象诞生以后,还必须进行输入/输出流的连接。服务器端的这个Socket对象(socketAtServer)使用getOutputStream()获得的输出流 将指向客户端Socket对象socketAtClient使用方法getInputStream()获得的那个输入流。同样,服务器端的这个Socket对象(socketAtServer)使用方法getInputStream()获得的输入流 指向客户端Socket对象(socketAtClient)使用方法getOutputStream()获得的那个输出流。因此,当服务器向这个输出流写入信息时,客户端通过相应的输入流就能读取,反之亦然,如下图:
需要注意的是,从套接字连接中读取数据与从文件中读取数据有着很大的不同,尽管二者都是输入流。从文件中读取数据是,所有的数据都已经在文件中了。而使用套接字连接时,可能在另一端数据发送出来之前,就已经开始试着读取了,这就会堵塞本线程,直到该读取方法成功读取到信息,本线程才继续执行后续的操作。
连接建立后,服务器端的套接字对象调用getInetAddress()方法可以获取一个InetAddress对象,该对象含有客户端的IP地址和域名。同样,客户端的套接字对象调用getInetAddress()方法可以获取一个InetAddress对象,该对象含有服务器端的IP地址和域名。
2.套接字关闭
套接字调用close()方法可以关闭双方的套接字连接,只要一方关闭连接,就会导致对方发生IOException异常。
简单例子(客户端与服务器端通信):
服务器端的代码如下:
package com.hsp.socket; import java.io.DataInputStream; import java.io.DataOutputStream; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) { ServerSocket waitSocketConnection = null; Socket socketAtServer = null; DataInputStream in = null; DataOutputStream out = null; try { //中山广场邮局(本地),8号窗口(4431)的业务员 waitSocketConnection = new ServerSocket(4431);//端口号 //accept方法会引起堵塞,直到接收到客户端的套接字连接请求 //业务员时刻准备接待客户,直到业务员离开(waitSocketConnection.close()) socketAtServer = waitSocketConnection.accept(); in = new DataInputStream(socketAtServer.getInputStream()); out = new DataOutputStream(socketAtServer.getOutputStream()); while(true){ int m = 0; m = in.readInt(); System.out.println("test2:"+m); out.writeUTF("你说的数对应的数字是:"+m); System.out.println("服务器收到:"+m); Thread.sleep(500);//当前线程休眠500毫秒 } } catch (Exception e) { e.printStackTrace(); } } }
客户端的代码如下:
package com.hsp.socket; import java.io.DataInputStream; import java.io.DataOutputStream; import java.net.Socket; public class Client { public static void main(String[] args) { String s = null; Socket socketAtClient = null; DataInputStream in = null; DataOutputStream out = null; int i = 0; try { //建立一位客户(该客户与中山广场邮局,8号窗口的业务员建立联系) //创建客户的过程就是与业务员建立连接的过程。如果业务员不存在,则无法建立连接,并且会抛出异常 socketAtClient = new Socket("localhost", 4431); in = new DataInputStream(socketAtClient.getInputStream()); out = new DataOutputStream(socketAtClient.getOutputStream()); while(true){ i = (i+1)%128; System.out.println("test client"+i); out.writeInt(i); s = in.readUTF(); System.out.println("客户端收到:"+s); Thread.sleep(500); } } catch (Exception e) { e.printStackTrace(); } } }
相关推荐
Linux 套接字 Socket 函数手册 本文档是 Linux 套接字 Socket 编程手册,涵盖了 Socket 编程的各个方面,包括套接字函数、字节操作函数、IPv4 地址转换函数、IPv4、IPv6 通用地址转换函数和 TCP 套接口函数等。 套...
### 套接字Socket编程主要API解析 #### 一、引言 在现代网络通信领域,套接字(Socket)编程是一种重要的技术手段,它允许不同计算机之间进行数据交换。本文将详细介绍网络编程中主要使用的Socket API,这些API是网络...
尽做为想了解原始套接字或研究sniffer的朋友做示范操作 只要你具备相应的权限 只要在本机上运行本demo附带的exe 当你操作网络的时候就会把通过本机网卡的数据 给截获下来再gridlist中展示出来 目前只截获tcp udp ...
在IT领域,套接字(Socket)编程是网络通信的核心技术之一,它为应用程序提供了低级别的、进程间的通信机制。套接字允许不同计算机上的进程相互通信,无论是同在一个局域网还是跨越互联网。本篇文章将深入探讨套接字...
"套接字socket编程文档"可能包含了详细的代码示例,从创建套接字到实现完整的客户端-服务器通信流程,读者可以通过这些例子加深对Socket编程的理解。 七、MultiGet-1.1.4项目介绍 MultiGet是一个多线程下载工具,它...
本文将深入探讨一个基于C++ MFC(Microsoft Foundation Classes)框架实现的TCP异步套接字socket局域网聊天应用的源码。这个应用展示了如何利用Visual Studio的MFC库创建一个稳定的TCP连接,以及如何实现服务器与...
在IT领域,套接字(Socket)是网络通信的基础组件,尤其在开发涉及客户端与服务器交互的应用时。本文将深入探讨“套接字(Socket)通信TCP聊天程序(含界面)”这一主题,包括如何使用Java中的Socket和ServerSocket...
【套接字Socket编程详解】 套接字(Socket)是计算机网络编程中用于实现进程间通信的一种机制,它允许不同的设备或程序之间进行数据交换。Socket编程基于传输控制协议(TCP)或用户数据报协议(UDP),分别对应于...
### Linux系统编程——第七章:套接字Socket #### 知识点概览 - **套接字(Socket)的概念** - **面向连接与非连接的套接字编程方法** - **IP地址处理** - **端口配置** - **字节序转换** - **地址转换与打印** - *...
多线程 群聊功能 网络编程 套接字 socket 实现群聊功能
【套接字Socket编程基础】 在计算机网络编程中,Socket是一种接口,允许应用程序与网络通信。"Talk is cheap, show me the code1"这句标题暗示我们将深入到实际的代码层面,了解如何利用Socket进行TCP和UDP协议的...
JAVA网络编程资料(1)-Socket套接字—Java套接字编程.chm
套接字(Socket)是实现网络通信的一种基本机制,它是进程间通信(IPC,Inter-Process Communication)在网络层面上的体现。本文将深入探讨套接字的概念、TCP协议以及如何在代码中实现客户端和服务端的通信。 套接...
在本文中,我们将深入探讨如何在Visual Studio 2013中使用C++和套接字(Socket)技术实现一个简单的控制台客户端和服务器网络通信的示例。套接字是计算机网络编程中的基本组件,它允许不同设备之间的数据交换。在C++...
在VC++环境中,套接字(Socket)是网络编程中的基本元素,用于实现进程间的通信。这个示例展示了如何在Windows环境下使用Visual C++(VC)进行基于套接字的网络通信,特别是在处理错误时,如何实现一个带有接收错误...
1.1 Socket套接字简介 Socket位于传输层与应用层之间,作为两者之间的桥梁。它提供了一组API接口,使得程序员可以通过这些接口发送和接收数据,而无需关心TCP/IP协议的具体实现。Socket遵循门面设计模式,将复杂的...
1. 创建套接字:使用`socket()`函数创建一个流式套接字(SOCK_STREAM),对应TCP协议。 2. 连接服务器:使用`connect()`函数连接到指定的IP地址和端口号。 3. 构建HTTP请求:编写GET请求字符串,包含请求方法、URL、...
在IT领域,网络通信是至关重要的部分,而网络套接字(Socket)是实现网络通信的基础工具。"网络套接字实现服务器返回客户机发送数据"这个标题涉及到的是客户端-服务器(Client-Server)架构中的数据交互过程。下面将...
这是在linux平台下实现了聊天程序,网络套接字socket编程,还赋有实验报告,大家多多指教。
原始套接字(Raw Socket)是Winsock提供的一种套接字类型,允许开发者直接访问网络接口,捕获和发送原始的网络数据包。原始套接字可以用来捕获和解析网络数据包,实现网络嗅探和协议分析等功能。 IP数据包捕获 在...