我是Socket
的新手,我尝试在同一个应用程序上对服务器和客户端进行编码,以了解它是如何工作的。
代码:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
((Button)this.findViewById(R.id.bouton1)).setOnClickListener(this);
}
public void onClick(View v) {
TCPServer server = new TCPServer();
TCPClient client = new TCPClient();
server.start();
client.start();
}
public class TCPServer extends Thread {
@Override public void run() {
try {
ServerSocket s = new ServerSocket(8080,0,InetAddress.getLocalHost());
Socket cli = s.accept();
byte[] b = new byte[512];
int n;
InputStream is = cli.getInputStream();
while((n=is.read(b))>0){
Log.d("TCPServer",new String(b));
if(new String(b).contains("\r\n\r\n"))break;
b = new byte[512];
}
OutputStream os = cli.getOutputStream();
os.write("Hello".getBytes());
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class TCPClient extends Thread {
@Override public void run() {
try {
Socket s = new Socket(InetAddress.getLocalHost().getHostAddress(),8080);
//Socket s = new Socket("www.google.com",80);
//Log.i("",s.getLocalAddress().getHostAddress());
byte[] b = new byte[512];
int n;
if (s.isConnected()) {
OutputStream os = s.getOutputStream();
os.write("Hi How are you \r\n\r\n".getBytes());
InputStream is = s.getInputStream();
while((n=is.read(b))>0){
Log.d("TCPClient",new String(b));
b = new byte[512];
}
}
s.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
代码工作正常,但我第一次点击我的按钮。
错误是java.net.BindException: Address already in use
。
答案 0 :(得分:0)
如果它第一次运行,但之后没有,听起来你没有在程序退出之前正确关闭套接字。
您可以通过运行
来检查它是否仍处于打开状态netstat
待你不在Windows机器上。我相信他们有类似的东西。
答案 1 :(得分:0)
抱歉,我忘记在打开后关闭ServerSocket