我用原生的TCP Socket,会不定时的丢包然后重传导致粘包。用UDP Socket,丢包更严重,几秒就丢一次,数据传输不流畅。怎么破?
你见过有用java开发的商业游戏么?
把部分代码贴上,求各位指导
这是服务器接收部分
public void startServer() {
new Thread() {
@Override
public void run() {
super.run();
try {
flag = true;
mServerSocket = new ServerSocket(mServerPort);
while (flag) {
Socket clientSocket = mServerSocket.accept();
mSockets.add(clientSocket);
String hostAddress = clientSocket.getInetAddress().getHostAddress();
int localPort = clientSocket.getLocalPort();
Log.d(TAG, "startServer: ip->" + hostAddress + ",port->" + localPort);
mServerCallback.clientConnected();
SocketThread socketThread = new SocketThread(clientSocket);
socketThread.start();
mClients.add(socketThread);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
closeServer();
}
}
}.start();
}
这是服务器处理客户端部分
/**
* 客户端线程
*/
private class SocketThread extends Thread {
private Socket mClientSocket;
private BufferedReader mBufferedReader;
private PrintStream mPrintStream;
public SocketThread(Socket clientSocket) {
mClientSocket = clientSocket;
}
@Override
public void run() {
super.run();
try {
mPrintStream = new PrintStream(mClientSocket.getOutputStream(), true, "UTF-8");
mBufferedReader = new BufferedReader(new InputStreamReader(mClientSocket.getInputStream(), "UTF-8"));
MyApplication.sCurActivity.remoteMode();//向客户端发送当前遥控模式
while (flag) {
if (mBufferedReader.ready()) {
String readLine = mBufferedReader.readLine();
Log.d(TAG, "accept: "+readLine);
if (String.valueOf(CLIENT_STOP).equals(readLine)) {
break;
}
mServerCallback.accept(readLine);
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
// sendStopMessage();
try {
if (mPrintStream != null) {
mPrintStream.close();
}
if (mBufferedReader != null) {
mBufferedReader.close();
}
if (mClientSocket != null) {
mClientSocket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
mSockets.remove(mClientSocket);
mClients.remove(this);
}
}
/**
* 向客户端发送关闭标识
*/
private void sendStopMessage() {
mPrintStream.println(String.valueOf(SERVER_STOP));
}
}
用nio就可以实现高性能网络通信
Mina、Netty、Grizzly