java 如何前套接字未建立成功,Android和java套接字。成功之前多次尝试套接字连接...

我试图进入物联网,想让应用程序从android手机发送一个字符串到Linux PC。该应用通过实施一个asynctask来做到这一点:

//From the java docs, slightly modified

private Void sendThroughSocket(String s, String host, int port) {

Log.d("E", "In send through socket");

final String hostName = host;//Host is the address of the receiver, can be IP or domain

int portNumber = port;

//Check if device is connected to internet

try {

Socket clientsocket = new Socket(hostName, portNumber); //one of 2-way point communication

Log.d("E", "Created Socket: ");

DataOutputStream DOS = new DataOutputStream(clientsocket.getOutputStream());

if (clientsocket.isConnected())

Log.d("E", "Socket connected");

DOS.writeUTF(s);

clientsocket.close();

} catch (UnknownHostException e) {

System.err.println("Don't know about host " + hostName);

new Runnable() {

public void run() {

Toast.makeText(context, "Don't know about host " + hostName, Toast.LENGTH_SHORT).show();

}

};

} catch (IOException e) {

System.err.println("Couldn't get I/O for the connection to " + hostName);

//Toast can not be run using asynctask since it acesses UI

new Runnable() {

public void run() {

Toast.makeText(context, "Couldn't get I/O for the connection to " + hostName + " , check the port", Toast.LENGTH_SHORT).show();

}

};

} catch (Exception e) {

Log.d("E", "#fares" + e.getClass().getName().toString());

}

return null;

}我有3次尝试发送字符串,全部都是从我的搜索栏触发的(我将搜索栏进度值作为字符串发送):

public void onProgressChanged(SeekBar seekBar,int i,boolean b)

public void onStartTrackingTouch(SeekBar seekBar)

public void onStopTrackingTouch(SeekBar seekBar)

全部3的实现是相同的:

public void onProgressChanged(SeekBar seekBar,int i,boolean b){

progressvalue = i;

textView.setText("Brightness = " + progressvalue + " %");

if (((RecieverPort.equals("Please enter port Number")) || (RecieverIP.equals("Please enter receiver IP")))) {

//Make sure toast isn't persistent

if (IPPortToastcount++ == 0)

Toast.makeText(MainActivity.this, "Please set both IP and Port ", Toast.LENGTH_SHORT).show();

} else {

//Check if connected to internet

if (!isConnectedtoInternet(MainActivity.this)) {

if (ConnectivityToastCount++ < 1)

Toast.makeText(MainActivity.this, "You are not connected to the Internet", Toast.LENGTH_SHORT).show();

} else {

//Send text over wifi

SendText ST = new SendText(getApplicationContext());

ST.execute(String.valueOf(progressvalue), RecieverIP, RecieverPort);

ST.cancel(false);

}

}

}主要

//Send text over wifi

SendText ST = new SendText(getApplicationContext());

ST.execute(String.valueOf(progressvalue), RecieverIP, RecieverPort);

ST.cancel(false);服务器端(我的电脑)非常简单:

int portNumber = 44339; // Choose unused port on router

//Open a socket

try {

//System.out.println("in try statement");

try (ServerSocket serverSocket1 = new ServerSocket(portNumber)) {

portNumber = serverSocket1.getLocalPort();

System.out.println("Created socket at port " + portNumber);

Socket clientSocket = serverSocket1.accept();

System.out.println("Accepted");

DataInputStream DIS = new DataInputStream(clientSocket.getInputStream()); //get input from socket

//System.out.println("Created reader");

String inputLine;

// System.out.println("About to read");

while (DIS.available() > 0) {

inputLine = DIS.readUTF();

System.out.println(inputLine);

}

}

} catch (Exception e) {

System.out.println("Exception caught when trying to listen on port "

+ portNumber + " or listening for a connection");

System.out.println(e.getClass().getSimpleName());

}这种工作,除了服务器套接字被接受之前需要很长时间(秒)。它也只适用于onprogresschanged,这使我相信多次尝试

//Send text over wifi

SendText ST = new SendText(getApplicationContext());

ST.execute(String.valueOf(progressvalue), RecieverIP, RecieverPort);

ST.cancel(false);在成功创建套接字并连接到PC之前需要。我怎样才能确保一个水龙头,或一个函数的调用将足以发送字符串?

对不起长篇文章,但这是我第一次问:)

编辑:我的新服务器代码:

try {

//System.out.println("in try statement");

try ( ServerSocket serverSocket1 = new ServerSocket(portNumber))

{

portNumber = serverSocket1.getLocalPort();

System.out.println("Created socket at port " + portNumber);

while(true){

Socket clientSocket = serverSocket1.accept();

// System.out.println("Accepted");

DataInputStream DIS = new DataInputStream(clientSocket.getInputStream()); //get input from socket

//System.out.println("Created reader");

//String inputLine;

//System.out.println("About to read");

System.out.println(DIS.readUTF());

}

}

} catch (Exception e) {

System.out.println("Exception caught when trying to listen on port "

+ portNumber + " or listening for a connection");

System.out.println(e.getClass().getSimpleName());

}值得注意的是,即使在真正的循环中,服务器将始终显示4个数字,然后停止。

编辑:这里是一个例子日志:

10-06 20:08:09.145 26372-26372 / com.example.fares.ledslider D / E:测试方法中值#值= 50

10-06 20:08:26.475 26372-26372 / com.example.fares.ledslider D / E:#开始跟踪中的费用

10-06 20:08:26.722 26372-27004 / com.example.fares.ledslider D / E:#fares Socket connected

10-06 20:08:26.810 26372-26764 / com.example.fares.ledslider D / E:#fares Socket connected

10-06 20:08:27.241 26372-27003 / com.example.fares.ledslider D / E:#fares Socket connected

10-06 20:08:27.304 26372-26372 / com.example.fares.ledslider D / E:#fares停止跟踪

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值