连接成功,当客户端发送数据未到达服务器但客户端断开连接发送到服务器的数据
Connection is success, when client sent data not reached to server but client disconnects data sent to server
我在这里放了一些代码,建立了连接,但是每当客户端想要向服务器发送一些数据时,如果客户端一到达服务器就断开连接,数据就不会发送,如何解决这个问题。
我想要什么:
如果连接建立但连接未关闭。
public class Server extends AppCompatActivity {
private ServerSocket serverSocket;
Handler UIHandler;
Thread Thread1 = null;
EditText edText;
public static final int SERVERPORT = 3000;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_server);
getSupportActionBar().setTitle("Server");
edText = (EditText) findViewById(R.id.editText);
UIHandler = new Handler();
this.Thread1 = new Thread(new Thread1());
this.Thread1.start();
}
class Thread1 implements Runnable {
InetAddress addr;
@Override
public void run() {
Socket socket = null;
try {
addr = InetAddress.getByName(getLocalIpAddress());
serverSocket = new ServerSocket(SERVERPORT);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
while (!Thread.currentThread().isInterrupted()) {
try {
socket = serverSocket.accept();
Thread2 commThread = new Thread2(socket);
new Thread(commThread).start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
private String getLocalIpAddress() throws Exception {
String resultIpv6 = "";
String resultIpv4 = "";
for (Enumeration en = NetworkInterface.getNetworkInterfaces();
en.hasMoreElements(); ) {
NetworkInterface intf = (NetworkInterface) en.nextElement();
for (Enumeration enumIpAddr = intf.getInetAddresses();
enumIpAddr.hasMoreElements(); ) {
InetAddress inetAddress = (InetAddress) enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress()) {
if (inetAddress instanceof Inet4Address) {
resultIpv4 = inetAddress.getHostAddress().toString();
} else if (inetAddress instanceof Inet6Address) {
resultIpv6 = inetAddress.getHostAddress().toString();
}
}
}
}
return ((resultIpv4.length() > 0) ? resultIpv4 : resultIpv6);
}
private class Thread2 implements Runnable {
Socket clientSocket;
BufferedReader input;
String read;
public Thread2(Socket clientSocket) {
this.clientSocket = clientSocket;
try {
this.input = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
read = this.input.readLine();
if (read != null) {
Server.this.runOnUiThread(new Runnable() {
@Override
public void run() {
edText.setText(edText.getText().toString() + "Client says: " + read + "\n");
Log.i("hhFULL", edText.getText().toString());
}
});
} else {
Thread1 = new Thread(new Thread1());
Thread1.start();
return;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
这可能是因为您使用的客户端发送的消息末尾没有 \n 或 \r。下面从 inputStream 读取一行的代码无限等待换行符:-
read = this.input.readLine();
问题已解决,当客户端发送一些数据时,需要(ASCII码)换行。
我在这里放了一些代码,建立了连接,但是每当客户端想要向服务器发送一些数据时,如果客户端一到达服务器就断开连接,数据就不会发送,如何解决这个问题。
我想要什么: 如果连接建立但连接未关闭。
public class Server extends AppCompatActivity {
private ServerSocket serverSocket;
Handler UIHandler;
Thread Thread1 = null;
EditText edText;
public static final int SERVERPORT = 3000;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_server);
getSupportActionBar().setTitle("Server");
edText = (EditText) findViewById(R.id.editText);
UIHandler = new Handler();
this.Thread1 = new Thread(new Thread1());
this.Thread1.start();
}
class Thread1 implements Runnable {
InetAddress addr;
@Override
public void run() {
Socket socket = null;
try {
addr = InetAddress.getByName(getLocalIpAddress());
serverSocket = new ServerSocket(SERVERPORT);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
while (!Thread.currentThread().isInterrupted()) {
try {
socket = serverSocket.accept();
Thread2 commThread = new Thread2(socket);
new Thread(commThread).start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
private String getLocalIpAddress() throws Exception {
String resultIpv6 = "";
String resultIpv4 = "";
for (Enumeration en = NetworkInterface.getNetworkInterfaces();
en.hasMoreElements(); ) {
NetworkInterface intf = (NetworkInterface) en.nextElement();
for (Enumeration enumIpAddr = intf.getInetAddresses();
enumIpAddr.hasMoreElements(); ) {
InetAddress inetAddress = (InetAddress) enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress()) {
if (inetAddress instanceof Inet4Address) {
resultIpv4 = inetAddress.getHostAddress().toString();
} else if (inetAddress instanceof Inet6Address) {
resultIpv6 = inetAddress.getHostAddress().toString();
}
}
}
}
return ((resultIpv4.length() > 0) ? resultIpv4 : resultIpv6);
}
private class Thread2 implements Runnable {
Socket clientSocket;
BufferedReader input;
String read;
public Thread2(Socket clientSocket) {
this.clientSocket = clientSocket;
try {
this.input = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
read = this.input.readLine();
if (read != null) {
Server.this.runOnUiThread(new Runnable() {
@Override
public void run() {
edText.setText(edText.getText().toString() + "Client says: " + read + "\n");
Log.i("hhFULL", edText.getText().toString());
}
});
} else {
Thread1 = new Thread(new Thread1());
Thread1.start();
return;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
这可能是因为您使用的客户端发送的消息末尾没有 \n 或 \r。下面从 inputStream 读取一行的代码无限等待换行符:-
read = this.input.readLine();
问题已解决,当客户端发送一些数据时,需要(ASCII码)换行。