1、网络编程的三类socket
SOCK_STREAM:TCP,一对一字节流通信,双向通信
SOCK_DGRAM:UDP,报文服务,双向通信
SOCK_RAW:java不支持
2、Socket服务器
(1)端口port范围0-65525,port = 0时监听所有空闲端口。
(2)服务器示例代码,添加异常处理
import java.io.*
import java.net.*
public class ServerView{
public static void main() throws IOException{
int port = 9779;
ServerSocket ss = null;
Socket s = null;
BufferedReader br = null;
PrintWriter pw = null;
try{
ss = new ServerSocket(port);
s = ss.accept(); //进程阻塞直到接收到客户端请求
// 调用Socket对象的getOutputStream()方法得到输入流
br = new BufferedReader(new InputStreamReader(s.getInputStream()));
// 调用Socket对象的getOutputStream()方法得到输出流
pw = new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
// 读取从客户端传过来的数据并加上"echo: ",发回给客户端
String str = "";
while((str = br.readLine()) != null) {
pw.print("echo:" + str); // 发回
pw.flush();
}
} catch(IOException e) { // 捕获异常输出
System.out.println(e);
} finally {
// 关闭连接
br.close();
pw.close();
s.close();
ss.close();
}
}
}
3、Socket客户端
(1)建立连接
try{
String host = "localhost"; // ip地址或主机名称
String port = 9779;
Socket clientSocket = new Socket(host, port);
} catch (UnknowHostException e) {
// 无法确定IP地址所代表的主机
System.out.println("主机不存在");
} catch (IOException e) {
// 创建套接字时发送IO异常
System.out.println("服务不存在或忙");
}
(2)与服务器交互
与服务器交互需要从上一步建立的Socket对象中获取数据输入流和数据输出流。我们从数据输出流中获取服务器进程返回的信息,将我们的请求写入数据输入流中
// 数据输入流:获取并处理来自服务器的信息
try {
BufferedReader input = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String message = "";
while( message = input.readLine() != null ) {
... // 按行处理来自服务器的消息
}
} catch (IOException e) {
System.out.println("数据读取出错:" + e.getMessage());
}
// 数据输出流:向服务器发送信息
try {
PrintWriter output = new PrintWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
String message = "";
... // 用户输入数据到message
// 发送信息
output.println(message);
output.flush();
} catch(IOException e) {
System.out.println("数据写入错误:" + e.getMessage());
}
(3)关闭Socket服务
关闭输入输出流和套接字
try {
output.close();
input.close();
socket.close();
} catch(IOException e) {
System.out.println("关闭出错:" + e.getMessage());
}