JAVA采用Socket对象封装了传统socket编程接口,提供了accept(), getInputStream()和getOutputStream()等方法,以简化传统socket编程模型。
对于TCP模型,JAVA封装了ServerSocket和Socket类分别用于创建Server端和Client端对象。服务端创建一个ServerSocket对象(在创建的过程中,自动执行了listen()方法),然后调用accept()方法,阻塞等待客户端连接。当有客户端连接过来,accept()方法返回一个同客户端通讯的Socket对象,服务端利用这个Socket对象获取InputStream和OutputStream来同客户端数据通讯。客户端创建一个Socket对象(在创建过程中,自动执行了connect()方法),然后通过这个Socket对象获取InputStream和OutStream来同服务端进行数据通讯。
示例代码如下:
ClientTest.java:
package com.myTCP;
import java.net.Socket;
import java.net.InetAddress;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.BufferedWriter;
public class ClientTest {
public static void main(String[] args) {
try {
Socket socket = new Socket(InetAddress.getLocalHost(), 5890);
// send to server
OutputStream outputStream = socket.getOutputStream();
OutputStreamWriter streamWriter = new OutputStreamWriter(outputStream);
BufferedWriter bufferedWriter = new BufferedWriter(streamWriter);
bufferedWriter.write("message from Client!");
// receive from server
InputStream inputStream = socket.getInputStream();
InputStreamReader streamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(streamReader);
System.out.println("I'm Client, Server said: " + bufferedReader.readLine());
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
ServerTest.java:
package com.myTCP;
import java.net.Socket;
import java.net.ServerSocket;
import java.net.InetAddress;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.BufferedWriter;
public class ServerTest {
public static void main(String[] args) {
try {
ServerSocket server = new ServerSocket(5890, 0, InetAddress.getLocalHost());
Socket socket = server.accept();
// receive from client
InputStream inputStream = socket.getInputStream();
InputStreamReader streamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(streamReader);
System.out.println("I'm Server, Client said: " + bufferedReader.readLine());
// send to client
OutputStream outputStream = socket.getOutputStream();
OutputStreamWriter streamWriter = new OutputStreamWriter(outputStream);
BufferedWriter bufferedWriter = new BufferedWriter(streamWriter);
bufferedWriter.write("message from Server!");
server.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
对于UDP模型,JAVA封装了DatagramSocket类和DatagramPacket类用于数据发送和接收。DatagramSocket类提供了send()和receive()接口,分别用于发送和接收DatagramPacket对象。这个比较简单,不再贴示例代码。