网络编程中两个主要的问题:一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。
在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机。而TCP层则提供面向应用的可靠(tcp)的或非可靠(UDP)的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的。
一个Socket由一个IP地址和一个端口号唯一确定。0~1023的端口号为系统所保留,例如http服务的端口号为80,ftp服务的端口号为23,telnet服务的端口号为21,所以我们在选择端口号时,最好选择一个大于1023的数以防止发生冲突。
public class SocketServer {
//socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。
public class SocketClient {
public static void main(String args[]) {
try {
// 向本机的4700端口发出客户请求
Socket socket = new Socket("127.0.0.1", 4700);
// 由系统标准输入设备构造BufferedReader对象
BufferedReader sin = new BufferedReader(new InputStreamReader(
System.in));
// 由Socket对象得到输出流,并构造PrintWriter对象
PrintWriter os = new PrintWriter(socket.getOutputStream());
// 由Socket对象得到输入流,并构造相应的BufferedReader对象
BufferedReader is = new BufferedReader(new InputStreamReader(socket
.getInputStream()));
String readline;
// 从系统标准输入读入一字符串
readline = sin.readLine();
// 若从标准输入读入的字符串为 "bye"则停止循环
while (!readline.equals("bye")) {
// 将从系统标准输入读入的字符串输出到Server
os.println(readline);
// 刷新输出流,使Server马上收到该字符串
os.flush();
// 在系统标准输出上打印读入的字符串
System.out.println("Client:" + readline);
// 从Server读入一字符串,并打印到标准输出上
System.out.println("Server:" + is.readLine());
// 从系统标准输入读入一字符串
readline = sin.readLine();
} // 继续循环
os.close(); // 关闭Socket输出流
is.close(); // 关闭Socket输入流
socket.close(); // 关闭Socket
} catch (Exception e) {
System.out.println("Error" + e); // 出错,则打印出错信息
}
}
}