new socket 连接超时是为毛

Android 码拜 3年前 (2017-04-18) 366次浏览
new socket 语句连接超时
AndroidManifest.xml已经添加过权限了

package com.example.administrator.ffffff;
import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
public class MainActivity extends Activity {
    EditText show;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        show = (EditText)findViewById(R.id.show);
        new Thread()
        {
            public void run()
            {
                try
                {
                    Socket socket = new Socket("192.168.1.102",30000);//这里连接超时
                    BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    String line = br.readLine();
                    show.setText("来自服务器的数据:" + line);
                    br.close();
                    socket.close();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
        }.start();
    }
}
//这个代码是运行在 Windows 上的
import java.util.concurrent.locks.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
import java.io.*;
import javax.swing.*;
import java.awt.*;
import java.net.*;
public class dd
{
	public static void main(String[]args)throws IOException
	{
		ServerSocket ss = new ServerSocket(30000);
		while(true)
		{
			Socket s= ss.accept();
			OutputStream os = s.getOutputStream();
			os.write("您好,您收到了服务器的新年祝福!\n".getBytes("utf-8"));
			os.close();
			ss.close();
		}
	}

}

发个截图来证明电脑IP地址没错
new socket 连接超时是为毛

解决方案

2

假如你用的是真机的话,让你电脑开热点,手机连着电脑的热点再试一下

2

引用:
Quote: 引用:

假如你用的是真机的话,让你电脑开热点,手机连着电脑的热点再试一下

什么叫开热点。手机和电脑都在同一个路由器下,为毛连不上

 new Thread()
        {
            public void run()
            {
                try
                {
                    Socket socket = new Socket("192.168.1.102",30000);//这里连接超时
                    BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    String line = br.readLine();
                    show.setText("来自服务器的数据:" + line);
                    br.close();
                    socket.close();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
        }.start();

这段写的很有问题,你应该需要新建一个子线程,通过white(ture){
//监听能否有信息
}
你现在只监听一次,连接不上很正常。而且子线程你是不能更新ui的,所以不能调用setText方法,需要用handler处理

2

引用:
Quote: 引用:

你现在只监听一次,连接不上很正常。而且子线程你是不能更新ui的,所以不能调用setText方法,需要用handler处理

这段代码是客户端,不是服务器!
另外,这段代码是照书打的,《疯狂Android讲义》第三版的565页

这个肯定是错的,android子线程是不能去更新ui的,除非用handler之类。这个例子本人没去敲过,本人感觉还是你的手机问题,你用模拟器试试

2

引用:
Quote: 引用:

这个肯定是错的,android子线程是不能去更新ui的,除非用handler之类。这个例子本人没去敲过,本人感觉还是你的手机问题,你用模拟器试试

木有模拟器,就算模拟器好使了,最终也还是要解决真机才算解决问题。

你用模拟器可以保证你的android是连的到java端的socket的,但是你现在用真机可能不行,现在的问题可能在这。或你直接拿书的光盘里的代码运行一下。

2

引用:
Quote: 引用:
Quote: 引用:

你现在只监听一次,连接不上很正常。而且子线程你是不能更新ui的,所以不能调用setText方法,需要用handler处理

这段代码是客户端,不是服务器!
另外,这段代码是照书打的,《疯狂Android讲义》第三版的565页

这个肯定是错的,android子线程是不能去更新ui的,除非用handler之类。这个例子本人没去敲过,本人感觉还是你的手机问题,你用模拟器试试

谁说子线程一定不能更新ui的

2

引用:
Quote: 引用:

或你直接拿书的光盘里的代码运行一下。

各种编译错误,R文件都找不到了。先睡觉了,困死了。明天在 看看

r文件找不到 说明你的 布局和图片之类的 有叉叉  , 仔细检查

4

引用:
Quote: 引用:
Quote: 引用:
Quote: 引用:

你现在只监听一次,连接不上很正常。而且子线程你是不能更新ui的,所以不能调用setText方法,需要用handler处理

这段代码是客户端,不是服务器!
另外,这段代码是照书打的,《疯狂Android讲义》第三版的565页

这个肯定是错的,android子线程是不能去更新ui的,除非用handler之类。这个例子本人没去敲过,本人感觉还是你的手机问题,你用模拟器试试

谁说子线程一定不能更新ui的

请写一个子线程更新ui的代码给本人看看

2

楼上的都说了,

2

引用:
Quote: 引用:

你用模拟器可以保证你的android是连的到java端的socket的,但是你现在用真机可能不行,现在的问题可能在这。或你直接拿书的光盘里的代码运行一下。

引用:

谁说子线程一定不能更新ui的

问题解决了,不是代码的问题,是特么的的 Windows 防火墙没关闭。但是成功连接以后 Windows 服务器发生了个异常,这是怎么回事。代码还是上面的代码。
new socket 连接超时是为毛

调用accept方法之前,socket已经被close了

2

以后这种情况下,可以先ping一下电脑端,看能否能ping通,防止浪费时间!

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明new socket 连接超时是为毛
喜欢 (0)
[1034331897@qq.com]
分享 (0)