Socket accept():如果接受到一个客户端Socket的连接请求,该方法将返回一个与连接客户端Socket对应的Socket(每个TCP有2个Socket),否则该方法将一直处于等待状态,线程也被阻塞。
ServerSocket类提供的构造器
ServerSocket(int port):用指定的端口来创建一个ServerSocket。该端口应该是有一个有效的端口整数值:0~65535.
ServerSocket(int port,int backlog):增加一个用来改变连接队列长度的参数backlog.
ServerSocket(int port,int backlog,InetAddress localAddr):在机器存在多个IP地址的情况下,允许通过localAddr这个参数来指定将ServerSocket绑定到指定的IP地址。
ServerSocket使用完毕后,应使用ServerSocket的close()方法来关闭ServerSocket。通常情况下,服务器不应该只接受一个客户端请求,而应该不断的接受来自客户端的所有请求,所以JAVA
通常会通过循环不停的调用ServerSocket的accept()方法,如以下代码片段所示
ServerSocket ss = new ServerSocket(30000);
while(true)
{
Socket s = ss.accept();
//通信内容
}
使用Socket进行通信
Socket(InteAddress/String rempteAddress,int port):连接到远程主机,远程端口的Socket,该构造器没有指定本地地址,本地端口,默认使用本地主机的默认IP地址,默认使用系统指定
的IP地址。
Socket(InteAddress/String remoteAddress,int port,InetAddress localAddr,int localPort):创建连接到指定远程主机,远程端口的Socket,并指定本地IP地址和本地端口号,使用于本
地主机有多个IP地址的情况。
服务器端PC上运行,JAVA实现
public class SimpleServer
{
public static void main(String[] args) throws IOException
{
ServerSocket ss = new ServerSocket(30000);
while(true)
{
Socket s = ss.accept();
OutputStream os = s.getOutStream();
os.write(" 您好!\n".getBytes("utf-8"));
os.close();
s.close();
}
}
}
客户端 Android
public class MainActivity extends Activity {
EditText show;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
show = (EditText) findViewById(R.id.show);
show.setText("来自服务");
new Thread()
{
@Override
public void run()
{
try
{
Socket socket = new Socket("192.168.8.32",30002);
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));//将Socket对应的输入流包装成BufferedReader
String line = br.readLine();
show.setText("来自服务器的数据"+line);
br.close();
socket.close();
}catch(IOException e)
{
e.printStackTrace();
}
}
}.start();
}
}