端口号一般使用2个字节(16bit)进行编号,最多可以有65536个端口,只有整数,范围是从0 到65535
第一类:公认端口(Well Known Ports):从0到1023,它们紧密绑定(binding)于一些服务。通常这些端口的通讯明确表明了某种服务的协议,例如:80端口实际上总是HTTP通讯。
? 第二类:注册端口(Registered Ports):从1024到49151。它们松散地绑定于一些服务。也就是说有许多服务绑定于这些端口,这些端口同样用于许多其它目的。例如:许多系统处理动态端口从1024左右开始。
? 第三类:动态和/或私有端口(Dynamic and/or Private Ports):从49152到65535。理论上,不应为服务分配这些端口。实际上,机器通常从1024起分配动态端口
TCP与UDP:
网络7层协议:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层
传输层的两个主要协议
TCP(Transmission Control Protocol)协议:传输控制协议,提供可靠无差错的数据传输,速度慢,占用系统资源高
UDP(User Datagram Protocol)协议:用户数据报协议,不可靠的数据传输,速度快,较安全。
Socket编程原理(基于TCP):
服务器端
(1) 创建ServerSocket对象,绑定监听端口;
(2) 通过accept()方法监听客户端请求;
(3) 连接建立后,通过输入流读取客户端发送的请求信息;
(4) 通过输出流向客户端发送相应信息;
(5) 关闭响应资源。
客户端
(1) 创建Socket对象,指明需要连接的服务器地址和端口;
(2) 连接建立后,通过输出流向服务器端发送请求信息;
(3) 通过输入流获取服务器端返回的响应信息;
(4) 关闭响应资源。
具体代码实现:
简单示例:
服务器:
try {
ServerSocket server = new ServerSocket(9000);
System.out.println(“服务器已经运行,等待客户端信息!”);
Socket socket = server.accept();
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(),true);
out.flush();
String clientMsg=in.readLine();
System.out.println(“客户端说:”+clientMsg);
out.println(“你好客户端:我是服务器,你的消息已经收到!”);
} catch (IOException e) {
e.printStackTrace();
}finally{
}
客户端:
Socket socket=null;
PrintWriter out=null;
BufferedReader reader=null;
try {
socket = new Socket(“127.0.0.1”,9000);
out = new PrintWriter(socket.getOutputStream(),true);
//print和write 重写了抽象类Writer里面的write方法
out.println(“你好服务器:我是客户端”);
out.flush();
reader = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
String serverMsg=reader.readLine();
System.out.println(“服务器回话:”+serverMsg);
} catch (Exception e) {
e.printStackTrace();
} finally{
try {
out.close();
reader.close();
socket.close();
}
catch (IOException e)
{e.printStackTrace(); }
}
模拟聊天:
服务器:
try {
ServerSocket serverSocket= new ServerSocket(9000);
Socket socket = serverSocket.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
Scanner sc = new Scanner(System.in);
PrintWriter printWriter =new PrintWriter(socket.getOutputStream(),true);
while(true){
String s = br.readLine();
System.out.println(“客户端说:”+s);
if(s.contains(“借钱”)){
printWriter.println(“你被拉入黑名单”);
break;
}
String next = sc.next();
printWriter.println(next);
printWriter.flush();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
客户端:
try {
Socket s=new Socket(“127.0.0.1”,9000);
PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
Scanner sc = new Scanner(System.in);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(s.getInputStream()));
while(true){
String next = sc.next();
pw.println(next);
pw.flush();
String s1 = bufferedReader.readLine();
System.out.println(“服务器说:”+s1);
if(s1.contains(“黑名单”)){
break;
}
}