这是问题所在。我正在尝试设置一个非常简单的应用程序,它将消息发送到Java服务器。
这是我的服务器代码:
ServerSocket serverSocket = null;
Socket clientSocket =null;
try
{
serverSocket = new ServerSocket(4444);
System.out.println("Server Started...");
clientSocket = serverSocket.accept();
}catch(Exception e){};
Scanner in = new Scanner(clientSocket.getInputStream());
String inputLine;
while (true)
{
if(in.hasNext())
{
inputLine=in.nextLine();
System.out.println("Message from server: "+inputLine);
}
}
这是客户端代码:
Socket client;
PrintWriter printwriter;
String serverIpAddress="192.168.173.1";
Button button;
TextView text;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button =(Button) findViewById(R.id.button);
text=(TextView) findViewById(R.id.textView);
button.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
new Thread(new Runnable()
{
@Override
public void run()
{
try
{
client = new Socket(serverIpAddress,4444);
printwriter = new PrintWriter(client.getOutputStream());
printwriter.write("Start");
printwriter.flush();
//printwriter.close();
//client.close();
}
catch(UnknownHostException e)
{
}
catch(IOException e)
{
e.printStackTrace();
}
}
}).start();
}
});
}
我有一个按钮,当我按下它时,一条消息被发送到服务器,它显示正常,但是当我按下按钮时,插座没有重新连接,所以我不能再次发送按摩。
要明确我打算最终添加更多按钮来发送不同的消息。我考虑创建一个全局套接字,但似乎没有去任何地方。
非常感谢任何帮助。
答案 0 :(得分:0)
这是因为您没有在客户端代码中关闭套接字。你应该关闭溪流&连接结束时服务器和客户端中的套接字。这样说,您应该保持连接活动并发送几条消息,而不是在发送一条消息后关闭连接。
我会将服务器代码重写为(请注意,它只处理一个客户端):
ServerSocket serverSocket = null;
Socket clientSocket =null;
Scanner in = null;
try
{
serverSocket = new ServerSocket(4444);
System.out.println("Server Started...");
clientSocket = serverSocket.accept();
in = new Scanner(clientSocket.getInputStream());
String inputLine;
while (true) {
if(in.hasNext()) {
inputLine=in.nextLine();
System.out.println("Message from server: "+inputLine);
}
}
} catch(IOException e) {
e.printStackTrace();
} finally {
if(in != null) {
in.close();
}
if(clientSocket != null) {
try {
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(serverSocket != null) {
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
请注意:我会使用DataInputStream& DataOutputStream ...以这种方式,您可以在服务器端使用in.readUTF(),它将阻塞,直到通过网络接收新内容。通过这种方式,您不必执行while(true),这对CPU来说会更好。
答案 1 :(得分:0)
谢谢大家的回复。我确实让它运转了。
多线程阅读器,谢谢你,你对我的问题所处的位置是完全正确的。我做的有点不同了。
我设置另一个类来设置套接字并创建一个方法来开始侦听给定的端口。在主要部分我只是把它放在循环中以保持关闭并重新创建套接字直到满足结束条件。
再次感谢所有人。