Socket 通信(一)-- 慕课网教程
什么是Socket?
网络中的进程间是通过socket来通信的。socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。我的理解就是Socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)。
SOCKET连接与TCP/IP连接
创建Socket连接时,可以指定使用的传输层协议,Socket可以支持不同的传输层协议(TCP或UDP)。
当使用TCP协议进行连接时,该Socket连接就是一个TCP连接。
Socket接口 是TCP/IP网络的API,Socket接口定义了许多函数或例程(listen/connect/read/write/),程序员可以用它们来开发TCP/IP网络上的应用程序,即为socket编程。
SOCKET是API,而TCP/UPD是通信协议,两种根本不同的东西。
Socket编程实例
服务端具体代码示例如下:
public class Server {
public static void main(String[] args) {
ServerSocket server=null;
try {
//1.创建一个服务器端socket,即ServerSocket,绑定指定的端口,并监听此端口
server=new ServerSocket(8888);
System.out.println("***服务器端启动,等待客户端的连接***");
//2.调用accept()方法开始监听,等待客户端的连接
Socket socket=server.accept();
//3.获取输入流,读取客户端信息
InputStream is=socket.getInputStream();//字节流
InputStreamReader isr=new InputStreamReader(is);//提高读取效率,将其转化为字符流
BufferedReader br=new BufferedReader(isr);//为输入流添加缓冲
String info=null;
while((info=br.readLine())!=null){
System.out.println("我是服务端,客户端说"+info);//循环读取客户端信息
}
socket.shutdownInput();//关闭输入流
//4.获取输出流,响应客户端信息
OutputStream os=socket.getOutputStream();
PrintWriter pw=new PrintWriter(os);
pw.write("欢迎您");
pw.flush();
socket.shutdownOutput();
//5.关闭相关资源
pw.close();
os.close();
br.close();
isr.close();
is.close();
socket.close();
server.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务端具体代码示例如下:
public class Client {
public static void main(String[] args) {
try {
//1.创建一个客户端socket,制定地址和端口
Socket client=new Socket("localhost", 8888);
//2.获取输出流,向服务器发送信息
OutputStream os=client.getOutputStream();//字节输出流
PrintWriter pw=new PrintWriter(os);//将字节流包装为打印流
pw.write("用户名为:admin,密码为:123");
pw.flush();
client.shutdownOutput();
//3.获取输入流,输出客户端响应信息
InputStream is=client.getInputStream();
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
String info=null;
while((info=br.readLine())!=null){
System.out.println("我是客户端,服务端说"+info);//循环读取服务端响应信息
}
client.shutdownInput();//关闭输入流
//4.关闭相关资源
br.close();
isr.close();
is.close();
pw.close();
os.close();
client.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
先启动server端,效果如下:
再启动client端。server端响应如下:
将控制台切换至客户端,响应如下:
至此,一个最基本的Socket通信实例就完成啦。要想实现服务端响应多个客户端消息,欢迎阅读我的下一篇博客点击打开链接。