Socket基础解析使⽤ServerSocket建⽴聊天服务器
很简单的教程哦!
1.socket 简介
Socket ⼜称"套接字",应⽤程序通常通过"套接字"向⽹络发出请求或者应答⽹络请求。ServerSocket ⽤于服务器端,Socket 是建⽴⽹络连接时使⽤的。在连接成功时,应⽤程序两端都会产⽣⼀个 Socket 实例,操作这个实例,完成所需的会话。
2.ServerSocket 的建⽴与使⽤
最简单的建⽴服务器ServerSocket
public class MyServerSocket {
public static void main(String[] args) {
try {
//1-65535 监听12345端⼝
ServerSocket serverSocket = new ServerSocket(12345);
//监听客户端链接,调⽤accept()⽅法 accept⽅法是⼀个阻塞的⽅法,会阻塞当前线程
Socket socket = serverSocket.accept();
//客户端有请求时,弹出提⽰框
JOptionPane.showMessageDialog(null, "有客户链接到了本机的12345端⼝");
} catch (IOException e) {
e.printStackTrace();
}
}
}
运⾏该代码,会发现程序阻塞在serverSocket.accept()处,打开浏览器请求127.0.0.1:12345 会有弹窗,程序结束
3.使⽤ ServerSocket 建⽴聊天服务器-1
上述⽅法是不合理的,因为accept()⽅法会造成程序阻塞,这样,主线程就会被阻塞,对于阻塞的代码,需要放置到独⽴线程中,修改如下
public class MyServerSocket {
public static void main(String[] args) {
new ServerListener().start();
}
}
监听链接的线程
/**
* 监听连接的线程
*/
public class ServerListener extends Thread{
@Override
public void run() {
try {
//1-65535 监听12345端⼝
ServerSocket serverSocket = new ServerSocket(12345);
/
/监听客户端链接,调⽤accept()⽅法 accept⽅法是⼀个阻塞的⽅法,会阻塞当前线程
//每当有⼀个客户端连接到当前的serversocket就会返回⼀个新的socket对象,所以当有多个的时候 //就要创建⼀个while循环来监听来⾃客户端的链接
while (true) {//true,让他⼀直处于循环,不会结束
Socket socket = serverSocket.accept();
//客户端有请求时,弹出提⽰框
JOptionPane.showMessageDialog(null, "有客户链接到了本机的12345端⼝");
//由于每个socket⼜要与独⽴的客户端进⾏通讯,所以将socket传递给新的线程
new ChatSocket(socket).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
⽤于通讯的线程
/**
* 创建⽤于socket通信的线程
*/
public class ChatSocket extends Thread {
Socket socket;//本地需要有socket来接受传⼊的s值
public ChatSocket(Socket s){
this.socket=s;
}
public void out(String out){
try {
// 执⾏数据的输出和相关功能的包装
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
int count = 0;
while (true) {
count++;
out("loop:"+count);
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
此时⼀个线程版的socket通信就算结束了,打开cmd 输⼊telnet localhost 12345会有惊喜哦
这种惊喜('telnet' 不是内部或外部命令,也不是可运⾏的程序)的⾃⾏百度
此时可以同时打开多个cmd 效果相同
4.使⽤ ServerSocket 建⽴聊天服务器-2
以上是⼀个简单的socket聊天服务器,但是当前的服务器只有向客户端发送数据的功能,并没有从客户端读取数据的功能!每个ChatSocket线程都是独⽴的,不能相互共同数据,建⽴ChatManager沟通所有数据,代码修改如下:
public class MyServerSocket {
public static void main(String[] args) {
new ServerListener().start();
}
}
监听链接的线程
/**
* 监听连接的线程
*/
public class ServerListener extends Thread{
@Override
public void run() {
try {
//1-65535 监听12345端⼝
ServerSocket serverSocket = new ServerSocket(12345);
//监听客户端链接,调⽤accept()⽅法 accept⽅法是⼀个阻塞的⽅法,会阻塞当前线程
//每当有⼀个客户端连接到当前的serversocket就会返回⼀个新的socket对象,所以当有多个的时候 //就要创建⼀个while循环来监听来⾃客户端的链接
while (true) {//true,让他⼀直处于循环,不会结束
Socket socket = serverSocket.accept();
//客户端有请求时,弹出提⽰框
JOptionPane.showMessageDialog(null, "有客户链接到了本机的12345端⼝");
//由于每个socket⼜要与独⽴的客户端进⾏通讯,所以将socket传递给新的线程
ChatSocket cs = new ChatSocket(socket);
cs.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
创建⽤于socket通信的线程
/**
* 创建⽤于socket通信的线程
*/
public class ChatSocket extends Thread {socket通信在哪一层
Socket socket;//本地需要有socket来接受传⼊的s值
public ChatSocket(Socket s){
this.socket=s;
}
public void out(String out){
try {
/
/ 执⾏数据的输出和相关功能的包装
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {//run⽅法中加⼊接收数据的功能
try {
BufferedReader br = new BufferedReader(
new InputStreamReader(
String line = null;
while ((line = br.readLine())!=null) {//客户端的数据
//发给聊天室的所有⼈
}
br.close();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
聊天管理类
/**
* 聊天管理类
*/
public class ChatManager {
//单例化该ChatManager
private ChatManager(){}
private static final ChatManager cm = new ChatManager(); public static ChatManager getChatManager(){
return cm;
}
Vector<ChatSocket> vector = new Vector<ChatSocket>(); public void add(ChatSocket cs){
vector.add(cs);
}
public void publish(ChatSocket cs,String out){
for(int i=0;i<vector.size();i++){
ChatSocket cschatSocket = (i);
if(!cs.equals(cschatSocket)){//发送消息的对象不接受消息本⾝ cschatSocket.out(out);
}
}
}
}
打开多个cmd,实现聊天功能,⽆论在哪个终端发,都能接收到消息
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论