使用Socket可以非常方便的进行通信,主要分成两个部分:
第一个部分ServerSocket,服务端等待客户端的连接;
第二个部分Socket,客户端连接服务端。
ServerSocket的使用方法如下
int port=23456;
ServerSocket server=new ServerSocket(port);
while(true){//等待客户端的连接
Socket ss=server.accept();
//收取客户端发送来的消息
BufferedReader br=new BufferedReader(new InputStreamReader(ss.getInputStream()));
String line=br.readLine();
System.out.println(line);
}
Socket的使用方法如下
String ip="192.168.1.113";
int port=23456;
Socket socket=new Socket(ip,port);
//发送消息给服务端
OutputStream os=socket.getOutputStream();
os.write("你好".getBytes("utf-8"));
os.close();
当服务端和客户端建立连接之后,可以互相发送消息和收取消息,
使用getOutputStream()方法进行发送消息,getInputStream()方法进行接收消息。
由于网络操作响应时间不确定,因此把这类操作放入新线程当中,以避免主程序长时间阻塞。
以下是对socket操作的封装类,并且将网络操作放入了新线程当中。
public class MySocket {
private int port;
private ServerSocket server;
private List<Message> msgList;
public MySocket(int port){
this.port=port;
msgList=new ArrayList<Message>();
try{
server=new ServerSocket(port);
acceptThread.start();//开启接受信息线程
}catch(Exception e){
e.printStackTrace();
}
}
//发送消息线程
public void send(Message msg){
Thread sendThread=new Thread(){
@Override
public void run() {
super.run();
try {
Socket socket = new Socket(msg.getIp(),msg.getPort());
OutputStream os=socket.getOutputStream();
os.write(msg.getContent().getBytes("utf-8"));
os.close();
socket.close();
}catch (IOException e) {
e.printStackTrace();
}
}
};
sendThread.start();
}
//接受信息的线程
private Thread acceptThread=new Thread(){
@Override
public void run() {
super.run();
while(true){
try {
Socket socket=server.accept();
InputStream is=socket.getInputStream();
String content=new BufferedReader(new InputStreamReader(is)).readLine();
Message message=new Message();
message.setIp(socket.getInetAddress().toString());
message.setPort(socket.getPort());
message.setContent(content);
msgList.add(message);
System.out.println(message.getContent());
is.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
};
}
其中所使用到的Message类如下
public class Message {
private String ip;//ip地址
private int port;//端口号
private String content;//信息内容
public Message(){ }
public Message(String ip,int port,String content){
this.ip=ip;
this.port=port;
this.content=content;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}