Java 套接字服务器帮助

标签 java android sockets

大家好,我是 Java 编程的新手,我真的很难让套接字服务器和客户端按照我想要的方式工作。

我遇到的问题是...

服务器:

我正在查看客户端的输出,一旦客户端打印“TIME”,服务器将返回一条消息,例如“时间是...”。服务器会执行此操作,但不会立即发送它,它似乎是在您第二次从客户端发送消息时发送的。

这是因为客户端没有一直连接吗?

我很确定这个方法是错误的,谁能给我一些建议。

任何帮助都会很棒。

卢克

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;


public class MyServer {

public static void main(String[] args){
ServerSocket serverSocket = null;
Socket socket = null;
DataInputStream dataInputStream = null;
DataOutputStream dataOutputStream = null;

try {
serverSocket = new ServerSocket(8888);
System.out.println("Listening :8888");
} catch (IOException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 }

 while(true){
 try {
socket = serverSocket.accept();
in = new BufferedReader(new InputStreamReader(
                socket.getInputStream()));


dataOutputStream = new DataOutputStream(socket.getOutputStream());
System.out.println("ip: " + socket.getInetAddress());
System.out.println("message: " + dataInputStream.readUTF());
dataOutputStream.writeUTF("Hello!");



try{
 String line = in.readLine();


 if (line.contains("TIME")){
  dataOutputStream.writeUTF("TIME IS.....");  // ITS HERE THE PROBLEM MAY BE ?

  {


    } catch (IOException e){
    System.out.println("Read failed");
    System.exit(1);
          }




 } catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  }
  finally{
  if( socket!= null){
    try {
     socket.close();
 } catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }
}

if( dataInputStream!= null){
 try {
  dataInputStream.close();
 } catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }
}

if( dataOutputStream!= null){
 try {
  dataOutputStream.close();
 } catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
    }
   }
   }
   }
   }
   }

Android 客户端

更新,我认为问题出在客户端仅在您发送消息时才连接。当我从客户端发送数据时,我如何在这里有一个不会影响的读取循环。

package com.exercise.AndroidClient;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class AndroidClient extends Activity {

EditText textOut;
TextView textIn;

/** Called when the activity is first created. */
    @Override
  public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);

 textOut = (EditText)findViewById(R.id.textout);
 Button buttonSend = (Button)findViewById(R.id.send);
 textIn = (TextView)findViewById(R.id.textin);
 buttonSend.setOnClickListener(buttonSendOnClickListener);
 }

 Button.OnClickListener buttonSendOnClickListener
 = new Button.OnClickListener(){

 @Override
 public void onClick(View arg0) {
 // TODO Auto-generated method stub
 Socket socket = null;
 DataOutputStream dataOutputStream = null;
 DataInputStream dataInputStream = null;

 try {
 socket = new Socket("192.168.1.101", 8888);
 dataOutputStream = new DataOutputStream(socket.getOutputStream());
 dataInputStream = new DataInputStream(socket.getInputStream());
 dataOutputStream.writeUTF(textOut.getText().toString());
 textIn.setText(dataInputStream.readUTF());
 }  catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
if (socket != null){
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

if (dataOutputStream != null){
try {
dataOutputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

if (dataInputStream != null){
try {
dataInputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}};
}

最佳答案

dataOutputStream.writeUTF() 行之后,写入 dataOutputStream.flush();。这将发送所有数据。

关于Java 套接字服务器帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6243376/

相关文章:

java - 如何在 Android 中签署 AAR Artifact ?

java - 为什么 '@'之后的cookie值部分被忽略了?

java - 导出 Jar 应用程序无法与 MySql 连接

java - 如何在 Equinox OSGI 服务器中定义默认欢迎页面?

android - MediaPlayer.create 异常

android - 无法在 Google Maps API v2 上设置标记 alpha 值

java - 使用 Java 将 SOAP 消息格式转换为 Socket 消息格式,反之亦然

python - 通过套接字发送pil图像而不保存python

java - Java编译并运行swing应用程序

java - windows下socket读取超时: strange hardcode in native method