一、Socket初识
socket是指在一个特定编程模型下,进程之间通信链路的端口。一个socket包括两个流,一个输入流和一个输出流。
在Java语言中,TCP/IP socket的连接是用java.net包中的类实现的。
1、实现思路
- 服务器分配一个端口号,监听端口是否有连接请求。如果客户请求一个连接,服务器使用accept()方法打开socket连接。
- 客户在host的port端口建立连接。
- 服务器和客户使用InputStream和OutputStream进行通信。
2、编程过程:
1. 创建Socket。
2. 打开连接到socket的输入/输出流。
3. 按照一定的协议对Socket进行读/写操作。
4. 关闭Socket。
二、客户套接字
SeverSocket类设计成在等待客户建立之前什么也不做的“监听器”。
1、构造函数
public Socket(String hostName, int port):创建一个本地主机与给定名称的主机和端口的套接字连接。
public Socket(InetAddress ipAddress, int port):用一个预先存在的InetAddress对象和端口创建一个套接字。
2、常用函数
Int getPoet():取得与该Socket对象连接的远程端口。
Int getLocalPort():取得与该Socket连接的本地端口。
InetAddress getInetAddress():取得与Socket对象相关的InetAddress。
public InputStream getInputStream():获取与调用套接字相关的InputStream类。
public OutputStream getOutputStream():获取与调用套接字相关的OutputStream类。
void close():关闭InputStream和OutputStream。
举个栗子:
import java.io.*;
import java.net.*;
public class hostDemo
{
public static void main(String[] args)
{
try
{
Socket connection = new Socket("www.baidu.com", 80);
System.out.println("建立连接...");
System.out.println("===========");
System.out.println("本地连接信息:");
System.out.println("地址:" + connection.getLocalAddress());
System.out.println("端口:" + connection.getLocalPort());
System.out.println("===========");
System.out.println("远程连接信息:");
System.out.println("地址:" + connection.getInetAddress());
System.out.println("端口:" + connection.getPort());
} catch (UnknownHostException e1)
{
System.out.println("未知主机:" + "www.baidu.com");
} catch (IOException e2)
{
System.out.println("IOException:" + e2);
}
}
}
运行结果:
建立连接...
===========
本地连接信息:
地址:/192.168.1.5
端口:4280
===========
远程连接信息:
地址:www.baidu.com/14.215.177.39
端口:80
三、服务器套接字
Java具有不同的用来创建服务器应用程序的套接字类。ServerSocket类用来创建服务器,并监听本地或远程客户程序通过公共端口的连接。
ServerSocket与Socket类完全不同。当创建一个ServerSocket类时,它将设置与自己感兴趣的客户连接。
1、构造函数
ServerSocket(int port):在指定端口创建队列长度为50的服务器套接字。
ServerSocket(int port, int maxQueue):在指定端口创建一个最大队列长度为maxQueue的服务器套接字。
ServerSocket(int port, int maxQueue,InetAddress localAddress): 在指定端口创建一个最大队列长度为maxQueue的服务器套接字。在一个多地址主机上,localAddress指定该套接字约束吃的IP地址。
2、ServerSocket类的accept()方法
该方法是一个等待客户开始通信的模块化调用,然后以一个用来与客户通信的常规Socket返回。accept()方法是阻塞性方法,调用后将等待客户的请求,直到有一个客户启动并请求连接到相同的端口。
举个栗子:
/*
服务器造5432端口提供服务,一直等待客户的请求。
如果客户发来请求,服务器端将发出提示信息,显示"Hello World!",关闭客户端连接,停止数据传输。
*/
public class hostDemo
{
public static void main(String[] args)
{
ServerSocket server = null; // 创建服务器
Socket socket1;
String sendString = "Hello World!";
OutputStream slout;
DataOutputStream dos;
try{
server = new ServerSocket(5432); // 服务器在端口5432上开辟新的服务
} catch (IOException e)
{
e.printStackTrace();
}
while (true)
{
try{
socket1 = server.accept(); // 保持监听状态
slout = socket1.getOutputStream(); // 通过Socket取得的数据流
dos = new DataOutputStream(slout);
dos.writeUTF(sendString); // 将数据流统一编码为UTF
slout.close(); // 接受数据流关闭
socket1.close(); // Socket关闭
} catch (IOException e)
{
e.printStackTrace();
}
}
}
}