当Java作为客户端,Android作为服务器时,ServerSocket不工作
我想让我的android作为服务器,PC上的Java作为客户端。这可能吗?我试过了,但有一些错误。我从教程中得到了服务器代码 注意:我已将电脑和手机连接到同一路由器上 服务器代码Android:当Java作为客户端,Android作为服务器时,ServerSocket不工作,java,android,sockets,serversocket,Java,Android,Sockets,Serversocket,我想让我的android作为服务器,PC上的Java作为客户端。这可能吗?我试过了,但有一些错误。我从教程中得到了服务器代码 注意:我已将电脑和手机连接到同一路由器上 服务器代码Android: public class Server extends Activity { private ServerSocket serverSocket; Handler updateConversationHandler; Thread serverThread = null;
public class Server extends Activity {
private ServerSocket serverSocket;
Handler updateConversationHandler;
Thread serverThread = null;
private TextView text;
public static final int SERVERPORT = 6000;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
text = (TextView) findViewById(R.id.text2);
updateConversationHandler = new Handler();
this.serverThread = new Thread(new ServerThread());
this.serverThread.start();
}
@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);
} 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 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();
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 Says: "+ msg + "\n");
}
}
}
Java客户端代码:
public class ServerCyb {
public static void main(String[]arg) throws Exception
{
Socket server1=new Socket("192.168.1.4", 6000);
OutputStream e=server1.getOutputStream();
PrintStream ps=new PrintStream(e);
ps.println("Test");
server1.close();
}
}
客户端错误:
Exception in thread "main" java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at ServerCyb.main(ServerCyb.java:20)
线程“main”java.net.ConnectException:连接被拒绝:连接
位于java.net.DualStackPlainSocketImpl.connect0(本机方法)
位于java.net.DualStackPlainSocketImpl.socketConnect(未知源)
位于java.net.AbstractPlainSocketImpl.doConnect(未知源)
位于java.net.AbstractPlainSocketImpl.connectToAddress(未知源)
位于java.net.AbstractPlainSocketImpl.connect(未知源)
位于java.net.PlainSocketImpl.connect(未知源)
位于java.net.socksocketimpl.connect(未知源)
位于java.net.Socket.connect(未知源)
位于java.net.Socket.connect(未知源)
位于java.net.Socket。(未知源)
位于java.net.Socket。(未知源)
位于ServerCyb.main(ServerCyb.java:20)
编辑:
我已经在AndroidManifest.xml中包含了所有需要的权限,这可能是android权限问题。检查AndroidManifest.xml文件中是否存在此权限:
<uses-permission android:name="android.permission.INTERNET" />
我认为AndroidManifest.xml的权限是-
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
尝试更换
套接字服务器1=新的套接字(“192.168.1.4”,6000)代码>带有
server1 = new Socket();
server1.connect(new InetSocketAddress(InetAddress.getByName("192.168.1.4"),6000), 100);
我找到了答案!:)
你需要这个:
ServerSocket server;
String hostname = "yourIpAdress";
server = new ServerSocket();
server.bind(new InetSocketAddress(hostname, port));
logcat中的服务器有什么消息吗?权限问题应该显示在那里,因为套接字创建将失败。没有来自logcat的错误消息。然后我已经包括了正确的权限AndroidManifest.xml添加了一些部分成功的日志记录。验证您的IP地址是否正确。尝试设备上的客户端…我会说您已关闭防病毒程序。它可能会阻止连接。此外,如果您从电话尝试此操作,并且服务器端位于您的PC上,请不要忘记向前移植,否则您的本地主机将是本地的,不是公共的。我已经包含了对AndroidManifest.xml的所有权限。也许您的防火墙正在阻止它。请确保在防火墙设置中允许在该端口上进行进出通信。错误的建议是,这将使客户端而不是服务器,并需要进行其他更改。
ServerSocket server;
String hostname = "yourIpAdress";
server = new ServerSocket();
server.bind(new InetSocketAddress(hostname, port));