Android 服务器可以';t向客户端发送消息
我想创建一个应用程序,服务器和客户端在其中相互通信。这里是代码 服务器端:Android 服务器可以';t向客户端发送消息,android,serversocket,Android,Serversocket,我想创建一个应用程序,服务器和客户端在其中相互通信。这里是代码 服务器端: public class MainActivity extends ActionBarActivity { private ServerSocket serverSocket; Handler updateConversationHandler; Thread serverThread = null; Socket clientSocket; private TextView text; EditText e
public class MainActivity extends ActionBarActivity {
private ServerSocket serverSocket;
Handler updateConversationHandler;
Thread serverThread = null;
Socket clientSocket;
private TextView text;
EditText edit;
Button b;
public static final int SERVERPORT = 6000;
String TimeStamp;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
System.out.println("inside onCreate");
text = (TextView) findViewById(R.id.textView1);
updateConversationHandler = new Handler();
this.serverThread = new Thread(new ServerThread());
this.serverThread.start();
TimeStamp = new java.util.Date().toString();
b=(Button)findViewById(R.id.button1);
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
try
{
EditText et = (EditText) findViewById(R.id.editText1);
String str = et.getText().toString();
text.setText(text.getText().toString()+"Me: "+ str +" On "+TimeStamp+ "\n");
/*
BufferedOutputStream bos=new BufferedOutputStream(socket.getOutputStream());
OutputStreamWriter osw= new OutputStreamWriter(bos,"US-ASCII");
osw.write(str+" "+TimeStamp);
osw.flush();
*/
if(clientSocket==null)
Toast.makeText(MainActivity.this, "null socket", Toast.LENGTH_SHORT).show();
else
{
PrintWriter out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(clientSocket.getOutputStream())),
true);
out.println(str);
out.flush();
et.setText("");
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
@Override
protected void onStop()
{
super.onStop();
try
{
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
class ServerThread implements Runnable
{
public void run()
{
Socket socket = null;
try
{
serverSocket = new ServerSocket(SERVERPORT);
serverSocket.setReuseAddress(true);
} catch (IOException e) {
e.printStackTrace();
}
while (!Thread.currentThread().isInterrupted())
{
try
{
socket = serverSocket.accept();
CommunicationThread commThread = new CommunicationThread(socket);
new Thread(commThread).start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
class CommunicationThread implements Runnable
{
//private Socket clientSocket;
private BufferedReader input;
public CommunicationThread(Socket aclientSocket)
{
//this.aclientSocket = clientSocket;
clientSocket=aclientSocket;
try {
//this.input = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));
this.input = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}
}
public void run()
{
while (!Thread.currentThread().isInterrupted())
{
try
{
String read = input.readLine();
updateConversationHandler.post(new updateUIThread(read));
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
class updateUIThread implements Runnable
{
private String msg;
public updateUIThread(String str)
{
this.msg = str;
}
@Override
public void run()
{
text.setText(text.getText().toString()+"Client: "+ msg +" On "+TimeStamp+ "\n");
}
}
}
从客户端发送的消息正确地接收到服务器,现在来自服务器的消息写入套接字,但无法在客户端读取
这里是客户端:
public class MainActivity extends ActionBarActivity {
private Socket socket;
Handler updateConversationHandler;
private static final int SERVERPORT = 5000;
private static final String SERVER_IP = "10.0.2.2";
TextView text;
Button c;
String TimeStamp;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread(new ClientThread()).start();
TimeStamp = new java.util.Date().toString();
c=(Button)findViewById(R.id.button1);
text = (TextView) findViewById(R.id.textView1);
c.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try
{
EditText et = (EditText) findViewById(R.id.editText1);
String str = et.getText().toString();
text.setText(text.getText().toString()+"Me: "+ str +"On "+TimeStamp+ "\n");
PrintWriter out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())),
true);
out.println(str);
out.flush();
et.setText("");
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
class ClientThread implements Runnable
{
@Override
public void run()
{
try
{
InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
socket = new Socket(serverAddr, SERVERPORT);
CommunicationThread commThread = new CommunicationThread(socket);
new Thread(commThread).start();
} catch (UnknownHostException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
class CommunicationThread implements Runnable
{
private Socket clientSocket;
private BufferedReader input;
public CommunicationThread(Socket clientSocket)
{
this.clientSocket = clientSocket;
try {
this.input = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}
}
public void run()
{
while (!Thread.currentThread().isInterrupted())
{
try
{
String read = input.readLine();
Log.d("msg","readString"+read);
updateConversationHandler.post(new updateUIThread(read));
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
class updateUIThread implements Runnable
{
private String msg;
public updateUIThread(String str)
{
this.msg = str;
System.out.println("message in updateThread "+msg);
}
@Override
public void run()
{
System.out.println("message "+msg);
text.setText(text.getText().toString()+"Server: "+ msg +"On "+TimeStamp+ "\n");
}
}
}
日志显示:
D/gralloc_goldfish(1777): Emulator without GPU emulation detected.
W/System.err(1777): java.lang.NullPointerException
W/System.err(1777): at com.example.socketservereg.MainActivity$1.onClick(MainActivity.java:67)
W/System.err(1777): at android.view.View.performClick(View.java:4240)
W/System.err(1777): at android.view.View$PerformClick.run(View.java:17721)
W/System.err(1777): at android.os.Handler.handleCallback(Handler.java:730)
W/System.err(1777): at android.os.Handler.dispatchMessage(Handler.java:92)
W/System.err(1777): at android.os.Looper.loop(Looper.java:137)
W/System.err(1777): at android.app.ActivityThread.main(ActivityThread.java:5103)
W/System.err(1777): at java.lang.reflect.Method.invokeNative(Native Method)
06-17
W/System.err(1777):位于java.lang.reflect.Method.invoke(Method.java:525)
我是一个初学者,任何帮助都将不胜感激 在您使用的服务器中
socket.getOutputStream()
但应该是这样
clientSocket.getOutputStream()
问题是什么?当您在主ui线程上输出时,客户端发送的消息不应到达服务器。请告知您是否使用模拟器/设备。解释设置。正在使用哪个Android版本?来自客户端的消息应该到达服务器,但服务器到客户端不显示。am通过端口转发进行仿真,比如Android 4.3上的“redir add tcp:5000:6000”和am在仿真上的工作,这一点尚不清楚。你使用两个模拟器吗?一个用于服务器,一个用于客户机?您能解释一下所有这些应该如何工作吗?是的,两个模拟器,首先运行服务器应用程序,然后在另一个上运行客户机。两者都使用相同的方法进行对话,它在客户端工作,而不是在服务器端。这一行使客户端无法运行,即一条消息“不幸的是,客户端已停止工作”,这是服务器的代码。发生了什么事?在哪一时刻/动作/代码行会发生这种情况?您没有在此处修改服务器代码。请展示你所做的。请发布logcat和stacktraces。实际上没有错误消息。如果我按下服务器端的发送按钮,消息将显示在服务器gui上,但在客户端上没有显示(我希望它像聊天一样)。我认为问题在于'onClick()'方法,这里的'PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);out.println(str);out.flush();et.setText(“”;'似乎不起作用,因为如果消息发送成功,editText将设置为null。但当我跑步时,什么也不会发生,也不会出错。是的,我以前见过。您正在使用socket.getOutputStream。它应该是clientSocket.getOutputstream。我不是说过吗?如果你现在要尝试,那么请调整你的代码,这样我们就可以看到你在做什么。我用logcat更新,但我不明白为什么会出现空指针异常,因为我在客户端也这样做
clientSocket.getOutputStream()