項目已經做的差不多了,其中做了一個消息的轉發功能,所以自己也寫一個簡單的例子看看
先一步步的來吧,先寫好一個Socket的消息傳輸的原型來,再一步步的改進吧。
其實在這個基礎上要中的東西還是很多的
1.客戶端的登陸
2.客戶端與服務端的斷連后重連
3.消息的編解碼
4.將傳輸改成由接收,發送,處理隊列與接收,發送,處理線程來做
5.隊列的超時機制
6.多線程安全
7.服務端收到消息可以進行群發或是轉發
.....
問題還是很多,先放個簡單的東西來做吧
Server原型
服務端主要是為了接收客戶端發來的消息并把這個消息群發到每一個客戶端去。所以設置了一個List以存入Socket
這里主要做的是在start()方法中開一個線程,讓服務端通過這個線程進行進行監聽客戶端發來的消息并拿到這個Socket對像,其實這東西本不需要開一個線程去做,但是為了不在ss.accept()的時候讓整個調用這個方法的主線程在那里等待,所以開了個線程去做,一但接到客戶端的消息就把接收線程拉起
Java代碼
package?demo;
import?java.io.DataInputStream;
import?java.io.DataOutputStream;
import?java.io.IOException;
import?java.io.InputStream;
import?java.io.OutputStream;
import?java.net.ServerSocket;
import?java.net.Socket;
import?java.util.LinkedList;
import?java.util.List;
public?class?Server?{
private?ServerSocket?ss?=?null;
private?List?list?=?new?LinkedList();
private?class?ReceiveThread?extends?Thread?{
private?Socket?socket?=?null;
public?ReceiveThread(Socket?socket)?{
super("ReceiveThread");
this.socket?=?socket;
}
@Override
public?void?run()?{
InputStream?in?=?null;
DataInputStream?dis?=?null;
while?(true)?{
try?{
sleep(50);
}?catch?(InterruptedException?e1)?{
e1.printStackTrace();
}
if?(socket?==?null?||?socket.isClosed()
||?!socket.isConnected())?{
continue;
}
try?{
in?=?socket.getInputStream();
dis?=?new?DataInputStream(in);
String?readUTF?=?dis.readUTF();
System.out.println("receive?client?message?:"?+?socket
+?"?"?+?readUTF);
send(readUTF);
}?catch?(IOException?e)?{
try?{
in.close();
dis.close();
}?catch?(IOException?e1)?{
e1.printStackTrace();
}
list.remove(socket);
e.printStackTrace();
}
}
}
}
public?void?send(String?msg)?throws?IOException?{
for?(int?i?=?;?i?
Socket?groupSocket?=?list.get(i);
OutputStream?out?=?groupSocket.getOutputStream();
DataOutputStream?dout?=?new?DataOutputStream(out);
dout.writeUTF(msg);
dout.flush();
out.flush();
}
}
public?class?AcceptSocketThread?extends?Thread?{
public?AcceptSocketThread()?{
super("AcceptSocketThread");
}
public?void?run()?{
try?{
ss?=?new?ServerSocket(7788);
while?(true)?{
Socket?socket?=?ss.accept();
list.add(socket);
new?ReceiveThread(socket).start();
}
}?catch?(IOException?e)?{
e.printStackTrace();
}
}
}
private?void?start()?throws?IOException?{
new?AcceptSocketThread().start();
}
public?static?void?main(String[]?args)?throws?Exception?{
System.out.println("Server?start?....");
new?Server().start();
}
}
2.客戶端Client
這個就比較簡單了,只是為了發送消息和接收消息
Java代碼
package?demo;
import?java.io.DataInputStream;
import?java.io.DataOutputStream;
import?java.io.IOException;
import?java.io.InputStream;
import?java.io.OutputStream;
import?java.net.InetAddress;
import?java.net.Socket;
import?java.util.Scanner;
public?class?Client?{
private?Socket?socket?=?null;
private?class?ReceiveThread?extends?Thread?{
@Override
public?void?run()?{
while?(true)?{
try?{
InputStream?in?=?socket.getInputStream();
DataInputStream?din?=?new?DataInputStream(in);
String?readUTF?=?din.readUTF();
System.out.println("Server?Send?Message:?"?+?readUTF);
}?catch?(IOException?e)?{
//?TODO?Auto-generated?catch?block
e.printStackTrace();
}
}
}
}
public?void?start()?throws?IOException?{
socket?=?new?Socket(InetAddress.getByName("127.0.0.1"),?7788);
new?ReceiveThread().start();
System.out.println("Client?start?....\nPlease?input?message?:?");
while?(true)?{
Scanner?scaner?=?new?Scanner(System.in);
String?next?=?scaner.next();
OutputStream?out?=?socket.getOutputStream();
DataOutputStream?dout?=?new?DataOutputStream(out);
dout.writeUTF(next);
//?scaner.close();
dout.flush();
}
}
public?static?void?main(String[]?args)?throws?IOException?{
System.out.println("client?...");
Client?client?=?new?Client();
client.start();
}
}
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态