Socket又称"套接字",网络上的两个程序经过一个双向的通讯链接实现数据的交换,这个链接的一端称为一个socket。java
ServerSocket,此类实现服务器套接字。服务器套接字等待经过网络传入的请求而后基于该请求执行某些操做,可能向请求者返回结果。编程
Socket方法 getInetAddress(); //远程服务端的IP地址 getPort(); //远程服务端的端口 getLocalAddress() //本地客户端的IP地址 getLocalPort() //本地客户端的端口 getInputStream(); //得到输入流 getOutStream(); //得到输出流 Socket状态 isClosed(); //链接是否已关闭,若关闭,返回true;不然返回false isConnect(); //若是曾经链接过,返回true;不然返回false isBound(); //若是Socket已经与本地一个端口绑定,返回true;不然返回false
说明:二者本质均是Socket间的通讯,一方为客户,另外一方为服务器。客户链接服务器,服务器接受客户并生成一个与其交流的Socket,而后客户发送请求,服务器作出响应。服务器
1.从套接字读取信息时,在有数据可供访问以前,读操做会被阻塞。网络
解决:对于不一样的应用应该设置合理的超时值。app
socket.setSoTimeout(10000);
说明:设置超时值后,若是没有在规定时间内接受到数据,就会抛出SocketTimeOutException异常。你能够捕获这个异常并作出反应。 socket
2.客户端在链接到服务器以前会一直堵塞。ui
解决:能够先构造一个无链接的套接字,而后再使用一个超时来进行链接的方法解决这个问题。spa
Socket socket = new Socket("127.0.0.1",12345); //用下面方法代替上面方法 Socket socket1 = new Socket(); socket1.connect(new InetSocketAddress("127.0.0.1",12345),timeout);
若是在客户端,你须要写下以下的代码就能够打开一个socket。.net
String host = "127.0.0.1"; int port = 8919; Socket client = new Socket(host, port);
上面代码中,host即客户端须要链接的机器,port就是服务器端用来监听请求的端口。在选择端口时,须要注意一点,就是0~1023这些端口都已经被系统预留了。这些端口为一些经常使用的服务所使用,好比邮件,FTP和HTTP。当你在编写服务器端的代码,选择端口时,请选择一个大于1023的端口。server
接下来就是写入请求数据,咱们从客户端的socket对象中获得OutputStream对象,而后写入数据后。很相似文件IO的处理代码。
public class ClientSocket { public static void main(String args[]) { String host = "127.0.0.1"; int port = 8919; try { Socket client = new Socket(host, port); Writer writer = new OutputStreamWriter(client.getOutputStream()); writer.write("Hello From Client"); writer.flush(); writer.close(); client.close(); } catch (IOException e) { e.printStackTrace(); } } }
相似文件IO,在读写数据完成后,咱们须要对IO对象进行关闭,以确保资源的正确释放。
int port = 8919; ServerSocket server = new ServerSocket(port); Socket socket = server.accept();
上面的代码建立了一个服务器端的socket,而后调用accept方法监听并获取客户端的请求socket。accept方法是一个阻塞方法,在服务器端与客户端之间创建联系以前会一直等待阻塞。
经过上面获得的socket对象获取InputStream对象,而后安装文件IO同样读取数据便可。这里咱们将内容打印出来。
public class ServerClient { public static void main(String[] args) { int port = 8919; try { ServerSocket server = new ServerSocket(port); Socket socket = server.accept(); Reader reader = new InputStreamReader(socket.getInputStream()); char chars[] = new char[1024]; int len; StringBuilder builder = new StringBuilder(); while ((len=reader.read(chars)) != -1) { builder.append(new String(chars, 0, len)); } System.out.println("Receive from client message=: " + builder); reader.close(); socket.close(); server.close(); } catch (Exception e) { e.printStackTrace(); } } }
仍是不能忘记的,最后须要正确地关闭IO对象,以确保资源的正确释放。
进行客户端-服务器端编程仍是比较有趣的,同时在Java中进行socket编程要比其余语言(如C)要简单快速编写。java.net这个包里面包含了不少强大灵活的类供开发者进行网络编程,在进行网络编程中,建议使用这个包下面的API。同时Sun.*这个包也包含了不少的网络编程相关的类,可是不建议使用这个包下面的API,由于这个包可能会改变,另外这个包不能保证在全部的平台都有包含。