Socket编程:
什么是Socket编程,socket编程是建立在传输层之上的,应用层之下的端对端网络通信:如图
所以按照传输层协议 Socket编程是分两大类(因为传输层主要是两类TCP/UDP):
1:TCP
2:UDP
另一种分类:阻塞和非阻塞编程
Socket编程的分类图:
TCP的同步阻塞通信:
主要依靠的有两个类:Socket和ServerSocket
Socket作用:
1.建立和远程服务器端的连接 如:Socket socket=new Socket("dict.org",2628); //连接的是dict服务器端
2.发送数据 如:PrintWriter pw=new PrintWriter(socket.getOutputStream())
3.接受数据 如: Scanner sc=new Scanner(socket.getInputStream() )
ServerSocket作用:
1等待连接 如:ServerSocket connect=new ServerSocket(5172))//在开一个本地端口 作为服务器端口 等待客户端来连接
2建立连接 如:Socket socket = connect.accept();//当有客户端连接我们建立的服务器时 在服务器端调用ServerSocket的accept()方法来获取Socket对象
下面是TCP阻塞Echo服务器的例子和其搭配的客户端(主要就是使用上面我们介绍的Socket和ServerSocket对象):
echo服务器:
package pre.guowei.Sock;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
/**
* TCP阻塞Echo服务器()
* @author 22116
*
*/
public class EchoServer {
public static void main(String[] args) {
try(ServerSocket connect=new ServerSocket(5172))
{
while (true) {
Socket socket = connect.accept();
new Thread(new Runnable() {
@Override
public void run() {
try (Scanner sc = new Scanner(socket.getInputStream());
PrintWriter pw = new PrintWriter(socket.getOutputStream(), true)) {
System.out.println("收到来自 " + socket.getRemoteSocketAddress() + "连接");
while (true) {
String s = sc.nextLine();
if (s.equals("see you"))
break;
pw.println(s);
pw.flush();
}
if (socket != null)
{
System.err.println("客户端"+socket.getRemoteSocketAddress()+"断开连接");
socket.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
对于上面的服务器其实严格上来说是非阻塞的 因为我使