java.net提供了两个类Socket和ServerSocket,分别用来表示双向连接的客户端和服务端。
1、 Socket构造:
Socket socket = new Socket(HOST, PORT);
HOST( ip地址):获取主机的ip,ifconfig查看ip,ping 通验证正确性
PORT(端口);
- 每一个端口提供一种特定的服务,只有给出正确的端口,才能获取相应的服务。
- 0~1023的端口号为系统所保留,例如http服务的端口号是80,telnet服务的端口号为21,ftp为23。所以我们在选择端口号时最好选择大于1023的数,防止发生冲突。
- 在创建Socket时,如果发生错误,将产生IOException,在程序中必须对其进行处理。所以在创建Socket或ServerSocket时必须捕获或抛出异常。
2、ServerSocket构造:
ServerSocket server = newServerSocket(4321);
Socket socket = server.accept();
- 该server只能接受一个请求,接收后就退出,实际中的应用是用循环接收。
- accept()是阻塞函数,即该方法被调用后将等待客户的请求,直到有一个客户启动并请求连接到相同的端口,然后accept()返回一个对应于客户的Socket。这时,客户方和服务方都建立的用于通信的Socket
- 建立通信后,由各个Socket分别打开各自的输入、输出流。
3、输入流输出流
Socket提供了getInputStream()和getOutputStream()方法来得到输入输出流。然后再对输入流输出流进行读写操作,
对于客户端,调用getInputStream方法即可得到来自服务器的流,调用getOutStream方法可得到向服务器端发送数据的流。
对于服务器端,得到Socket对象后,调用getInputStream方法即可得到来自客户端的流,调用getOutStream方法可得到向客户端发送数据的流。
关闭Socket和流
可调用Socket的close()方法进行关闭。在关闭前,应将与Socket相关的所有输入输出流关闭,正着打开,倒着关闭。
4、创建服务器的步骤:
1, 指定端口实例化一个ServerSocket
2, 调用ServerSocket的accept方法以在等待连接期间造成阻塞 3, 获取位于该底层Socket的流以进行读写操作 4, 将数据封装成流 5, 对Socket进行读写 6, 关闭打开的流
5、创建客户端的步骤:
1, 通过IP地址和端口实例化Socket,请求连接服务器 2, 获取Socket上的流以进行读写
3, 把流包装进BufferedReader/PrintWriter的实例 4, 对Socket进行读写 5, 关闭打开的流
6、当要监控多个客户端时,可使用类ExecutorService 其对象获取方法:Executors.newCachedThreadPool();
调用该对象的execute(Runnable command)即可,在未来某个时间执行给定的命令。该命令可能在新的线程、已入池的线程或者正调用的线程中执行,这由 Executor 实现决定
在android 2.3上设计的下载程序,在android 4.0上运行时报android.os.NetworkOnMainThreadException异常,原来在4.0中,访问网络不能在主程序中进行,有两个方法可以解决,一个是在主程序中增加: