socket
Posted 一路晨光
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了socket相关的知识,希望对你有一定的参考价值。
Java Scoket编程
Socket用于网络连接,其中封装了主机的名称,IP地址,端口号等信息。使用IO进行读写数据。
一、网络连接常用的模型:
1、C/S模式:Client/Server客户端对服务器端(QQ)
在C/S模式下,客户向服务器发出服务请求,服务器接收请求后,提供相应的服务。
客户端部分:为每个用户所专有的,负责执行前台功能。
服务器部分:由多个用户共享的信息与功能,招待后台服务。
优点:
B/S模式:浏览器/服务器模式,是一种特殊的C/S结构。
统一了客户端:浏览器
统一了通信协议:http协议
二、连接步骤
ServerSocket运行在服务端,Socket运行在客户端。
连接步骤:
1、创建ServerSocket
2、创建客户端Socket
3、打开输入输出流
4、进行读写操作达到通信的目的
5、关闭连接
三、Socket核心API
1、客户端
使用 new Socket(ip, port) 连接到服务器
如果连接成功, 就创建了Socket 对象,包含两个流(in, out)
InputStream in = s.getInputStream;//in 代表服务端到客户端的流
OutputStream out = s.getOutputStream();//out 代表客户端到服务器的流
如果连接失败, 就抛出异常,连接失败:
1)服务器没有运行
2)IP错误
3)Port 错误
2、服务端
ServerSocket ss = new ServerSocket(8888);
Socket s = ss.accept();
Accept()引起当前线程IO Block,等待客户端的连接。
如果连接成功就返回Socket实例s,s代表客户端的连接,s中包含流属性in和out
In代表客户端发送来的信息,out代表向客户端输出的信息。
案例:
(1)单个客户端连接到服务器
服务器端
public static void main(String[] args) {
try {
//1、绑定监听端口,tcp协议端口号为8888
ServerSocket server=new ServerSocket(8888);
//2、等待客户的连接
//accept方法是I/O阻塞方法,等待客户的连接,直到有客户端连接进来再继续执行
Socket socket=server.accept();
System.out.println("有客户连接进来....");
//3、Socket对象socket中包含两个流(in,out)
PrintWriter pw=new PrintWriter(
new OutputStreamWriter(socket.getOutputStream(),"gbk"));
pw.println("客户你你好");
pw.flush();//刷出缓存
BufferedReader reader=new BufferedReader(
new InputStreamReader(socket.getInputStream()));
String str=reader.readLine();
//I/O阻塞的方法,等客户说话,不说话不往下执行
System.out.println("客户说:"+str);
pw.close();
reader.close();
} catch (IOException e) {
//会出现端口号被占用的异常
e.printStackTrace();
}
}
客户端
public static void main(String[] args) {
try {
Socket socket=new Socket("localhost",8888);
InputStream in=socket.getInputStream();
System.out.println(in.getClass());
//读
BufferedReader reader=new BufferedReader(
new InputStreamReader(socket.getInputStream()));
String str=reader.readLine();
System.out.println("女神说:"+str);
//写
PrintWriter pw=new PrintWriter(
new OutputStreamWriter(socket.getOutputStream(),"gbk"));
pw.println("我说:你好");
pw.flush();//刷出缓存
pw.close();
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
(2)多线程
看案例
以上是关于socket的主要内容,如果未能解决你的问题,请参考以下文章