TCP(Transmission Control Protocol) 面向连接的通信协议ü,提供两台计算机间的可靠的、端到端的字节流通信的协议。
**UDP(User Datagram Protocal)**无连接的通信协议 UDP不保证可靠数据的传输。
14.1Socket原理
Socke——套接字,是网络应用程序编程的接口和一种机制,用套接字中的相关函数来建立连接和完成通信,Socket可以看成在两个程序进行通讯连接中的一个端点。
基于TCP的Socket编程:
利用TCP协议进行通信两个应用程序,有主从之分一个称为服务器程(Server),另外一机程(Client)。
交互过程:
(1) 服务器程序创建一个ServerSocket,然后调用accept方法等待客户来连接。
(2) 客户端程序创建一个socket,并请求与服务器建立连接。
(3) 刚才建立了连接的两个socket在一个单独的线程上对话。
(4) 服务器开始等待新的连接请求。
14.2Socket编程
----java.net.ServerSocket
构造函数:
ServerSocket(int port)
ServerSocket(int port, int maxqu)
accept( ) 方法用于等待客户端触发通信,返回值类型为Socket。
----java.net.Socket
构造函数:
Socket(String hostName, int port)
Socket(InetAddress a, int port)
可用方法:
InetAddress getInetAddress( )
int getPort( )
int getLocalPort( )
InputStream getInputStream()
OutputStream getOutputStream()
void close()
14.3实例
在使用Socket方法时首先要启动服务器。
public class Server {
public void start(){
int port = 8888;
ServerSocket serverSocket = null;
Socket socket = null;
try{
serverSocket = new ServerSocket(port);
while(true){
socket = serverSocket.accept();
System.out.println("客户端连接成功"+socket.getInetAddress().getHostAddress()
+":"+socket.getPort());
new Thread(new Chat(socket)).start();
}
}catch(IOException e){
e.printStackTrace();
}finally{
关闭连接操作
}
public static void main(String[] args) {
Server server2 = new Server();
server2.start();
}
}
Socket服务端方法实例:
步骤:定义属性port连接服务器:ServerSocket(port)等待客户连接.accept()InputStream,OutputStream读写数据close关闭连接。
例1:编写一服务器端程序,实现读取客户端发送过来的一组整数, 表现为一组数与数之间用空格隔开的字符串。对这组整数进行排序处理后,返回相应的字符串给客户端,如果数据格式不正确,则返回错误信息, 以本机作为服务器。
public class SortServer {
private int port = 8888;
source有参和无参构造方法
public void work() {
ServerSocket serverSocket = null;
Socket socket = null;
InputStream inputStream = null;
OutputStream outputStream = null;
try {
// 1.启动服务器监听
serverSocket = new ServerSocket(port);
// 2.等待客户端连接
socket = serverSocket.accept();
// 3.打开输入输出流
inputStream = socket.getInputStream();
outputStream = socket.getOutputStream();
// 4.读取客户端发生的数据
byte[] buffer = new byte[512];
while (true) {
int len = inputStream.read(buffer);
// 5.数据处理
String string = new String(buffer, 0, len);
String[] data = string.trim().split(" ");
try {
int[] intData = transferAndSort(data);
string = intArrayToString(intData, " ");
System.out.print("Presorted data:");
for (String a : data) {
System.out.print(a + " ");
}
System.out.println("Sorted data:" + string);
} catch (Exception e) {
string = e.getMessage();
string = "data format error!";
System.out.println(string);
}
// 6.把数据发送回客户端
outputStream.write(string.getBytes());
}
// 7.关闭流和网络
} catch (IOException e) {
e.printStackTrace();
} finally {
closeAll(outputStream, inputStream, serverSocket, socket);
}
}
//把字符串转换为整型
private int[] transferAndSort(String[] data) {
int[] intData = new int[data.length];
for (int i = 0; i < data.length; i++) {
intData[i] = Integer.parseInt(data[i]);
}
Arrays.sort(intData);
return intData;
}
private String intArrayToString(int[] data, String flag) {
StringBuffer buffer = new StringBuffer();
for (int d : data) {
buffer.append(d).append(flag);
}
return buffer.toString();
}
public static void main(String[] args) {
new SortServer().work();
}
}
Socket客户端方法实例:
步骤:定义属性host和port连接服务器:socket(host,port)InputStream,OutputStream读写数据close关闭连接。
例2:
public class SortClient {
private String host = "localhost";
private int port = 8888;
source有参和无参构造方法。
public void sort(){
Socket socket = null;
Scanner scanner = null;
InputStream inputStream = null;
OutputStream outputStream = null;
try {
socket = new Socket(host,port);
inputStream = socket.getInputStream();
outputStream = socket.getOutputStream();
scanner = new Scanner(System.in);
String intsString = scanner.nextLine();
outputStream.write(intsString.getBytes());
byte[] buffer = new byte[512];
int len = inputStream.read(buffer);
String string = new String(buffer,0,len);
System.out.println("排序后数据:"+string);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally{
clossAll(scanner, outputStream, inputStream, socket);
clossAll是自己构造的关闭连接方法
}
}
public static void main(String[] args) {
String host = "localhost";
int port = 8888;
new SortClient(host,port).sort();
}
}