Java 使用socket的android服务器客户端聊天
我正在使用套接字编程创建一个android服务器客户端聊天应用程序。到目前为止,在我的应用程序中,客户端消息将仅显示在服务器中。未显示来自服务器的消息。我之所以附加java代码,只是因为我认为您将从中了解xml布局组件 server.javaJava 使用socket的android服务器客户端聊天,java,android,sockets,serversocket,Java,Android,Sockets,Serversocket,我正在使用套接字编程创建一个android服务器客户端聊天应用程序。到目前为止,在我的应用程序中,客户端消息将仅显示在服务器中。未显示来自服务器的消息。我之所以附加java代码,只是因为我认为您将从中了解xml布局组件 server.java package com.example.androidsocketserver; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOExceptio
package com.example.androidsocketserver;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class Server extends ActionBarActivity {
private ServerSocket serverSocket;
private Button btn;
private boolean willsendMsg = false;
Handler handler;
Thread serverThread = null;
public static final int serverPort = 6000;
public static String SERVERIP = "10.0.2.15";
TextView serverStatus;
TextView text;
EditText msgg;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_server);
serverStatus = (TextView)findViewById(R.id.status);
text = (TextView)findViewById(R.id.chatt);
msgg = (EditText)findViewById(R.id.mesg);
btn = (Button)findViewById(R.id.send);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
willsendMsg = true;
}
});
handler = new Handler();
this.serverThread = new Thread(new ServerThread());
this.serverThread.start();
}
public class ServerThread implements Runnable{
Socket socket = null;
@Override
public void run() {
// TODO Auto-generated method stub
try {
serverSocket = new ServerSocket(serverPort);
while(true){
socket = serverSocket.accept();
handler.post(new Runnable(){
public void run(){
serverStatus.setText("New Connection accepted,and the address is" + socket.getInetAddress() + ", and the port is " + socket.getLocalPort());
}
});
CommunicationThread comm = new CommunicationThread(socket);
new Thread(comm).start();
}
} catch (IOException e) {
// TODO Auto-generated catch block
handler.post(new Runnable() {
@Override
public void run() {
serverStatus.setText("Couldn't detect internet connection.");
}
});
e.printStackTrace();
}
}
}
public class CommunicationThread implements Runnable{
private Socket client;
BufferedReader input;
String chat = msgg.getText().toString();
public CommunicationThread(Socket clientt){
this.client = clientt;
try {
this.input = new BufferedReader(new InputStreamReader(client.getInputStream()));
if(willsendMsg){
willsendMsg=false;
OutputStream outputSteam = client.getOutputStream();
PrintWriter pw = new PrintWriter(outputSteam, true);
pw.println(chat);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run() {
// TODO Auto-generated method stub
while(!Thread.currentThread().isInterrupted()){
try {
final String read = input.readLine();
handler.post(new Runnable(){
public void run(){
text.setText(text.getText().toString()+"Client :"+read+"\n");
}
});
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
protected void onStop() {
super.onStop();
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Client.java
package com.example.androidclientsocket;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
public class Clientsocket extends ActionBarActivity {
private Socket socket;
private static final int serverIPPort = 5000;
private static String server_IP = "10.0.2.2";
Handler handlers;
TextView inb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_clientsocket);
inb = (TextView)findViewById(R.id.inbox);
handlers = new Handler();
new Thread(new ClientThread()).start();
}
public class ClientThread implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
try {
InetAddress serverAdd = InetAddress.getByName(server_IP);
socket = new Socket(serverAdd,serverIPPort);
BufferedReader inputt = new BufferedReader(new InputStreamReader(socket.getInputStream()));
final String box = inputt.readLine();
handlers.post(new Runnable(){
public void run(){
inb.setText(inb.getText().toString()+"Server :"+box+"\n");
}
});
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void Posting(View v){
EditText et = (EditText)findViewById(R.id.msg);
String message = et.getText().toString();
try {
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
out.println(message);
et.setText("");
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
protected void onStop() {
super.onStop();
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
logcat在单击按钮时未显示任何异常或错误。我已经在清单文件中添加了internet和访问网络权限。请帮助我找到导致服务器消息未发送到客户端并显示在客户端的问题。从willsendMsg true开始。@greenapps:我尝试过,但也没有成功。
直到现在,在我的应用程序中,客户端消息只会显示在服务器上。
?你的客户没有发送任何东西。它刚刚开始阅读。您确定客户端已连接吗?您正在同一台pc上使用两个模拟器?因此,一旦新客户端连接,服务器将立即发送消息。但前提是willsendMsg是真的。之后,它将以循环方式逐行读取。为什么会有willsendMsg布尔值?我想你会有例外。如何从两个模拟器获取日志?您将在服务器发送第一条消息(如果willsendMsg)的地方得到一个异常。这将导致NetworkOnMainThread异常。将该代码也放在线程的run()方法中。