Socket是基于Tcp的链接,适用于长链接
Socke通讯需要客户端和服务器,客户端我们在android上编写,而服务器则选择在eclipse上编写
上效果图;
eclipse:
我们一共需要4个类,分别是
Server类,继承自Thread,用于建立服务器,并监听Socket的链接
MySocket类,继承自Thread,用于对Socket进行读写操作
SocketManager类,单态模式,管理Socket,不过主要的用途其实还是可以将信息发送给所有人
Start类,开启Server类
Start:
package wkk.server.socket;
public class Start {
public static void main(String[] args) {
new Server().start();
}
}
Server:
package wkk.server.socket;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server extends Thread {
private SocketManager manager;
@Override
public void run() {
try {
// 1-65535
ServerSocket ss = new ServerSocket(1234);
manager=SocketManager.getInstance();
while (true) {
// 此方法会阻塞线程 直至有人链接
Socket socket = ss.accept();
System.out.println("有客户端连接上服务器了");
MySocket socket1=new MySocket(socket);
socket1.start();
manager.add(socket1);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
new ServerSocket(1234);
这个方法的参数为int型端口号数值在1-65535之间,一般选择较大值避免冲突
accept(),这个方法会阻塞线程,所以适合在主线程中进行操作,我们循环监听Socket的链接,为每一个Socket开启一个独立的线程,并将Socket添加到SocketManager的list集合中
MySocket :
package wkk.server.socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
public class MySocket extends Thread {
private Socket socket;
private SocketManager manager;
public MySocket(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
manager=SocketManager.getInstance();
try {
//读取并发送
BufferedReader reader = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
String messageString = null;
while ((messageString = reader.readLine()) != null) {
System.out.println(messageString);
manager.sendAll(this, messageString);
}
reader.close();
manager.remove(this);
} catch (Exception e) {
}
}
//写
public void out(String out) {
try {
socket.getOutputStream().write((out + "\r\n").getBytes("utf-8"));