Java套接字
2015-08-15 20:03
537 查看
前言:
本文补充一下Java关于套接字方面的内容,因为其应用相对比较简单,所以下面介绍两个程序实例。
---------------------------------------------------------------------------------------
1.Socket对接过程
(注:这是之前在网上见过一张图片,大致过程还是比较清晰的)
分析:
Socket对接之后的数据传送类似于文件的读写;
流套接字采用TCP传输数据流,一旦数据发送失败将重传,所以具有安全无损的特点。
2.实例一【Server->Client(1:1)】
服务端输出(执行之后显示红点,表示等待中...):
客户端输出:
3.实例二【Server->Client(1:n)】
以上代码中,服务端创建多线程,给每一个对接的客户端分一个独立的线程;客户端代码不变,还是实例一的代码。程序输出跟实例一近似,只不过这是服务端一直运行着,可供多个客户端连接。(因为独立分配线程,程序运行时资源比较浪费,所以代码仅供参考,有待优化!)
本文补充一下Java关于套接字方面的内容,因为其应用相对比较简单,所以下面介绍两个程序实例。
---------------------------------------------------------------------------------------
1.Socket对接过程
(注:这是之前在网上见过一张图片,大致过程还是比较清晰的)
分析:
Socket对接之后的数据传送类似于文件的读写;
流套接字采用TCP传输数据流,一旦数据发送失败将重传,所以具有安全无损的特点。
2.实例一【Server->Client(1:1)】
package socket; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.Inet4Address; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.util.Date; public class Server { public Server(){ try { //服务端开启端口8000 ServerSocket serverSocket = new ServerSocket(8000); System.out.println("server start at:"+new Date()); //等待客户端相应 Socket socket = serverSocket.accept(); InetAddress address = socket.getInetAddress(); System.out.println("connected with address:"+address.getHostAddress()); DataInputStream input = new DataInputStream(socket.getInputStream()); DataOutputStream output = new DataOutputStream(socket.getOutputStream()); //while(true){ int num = input.readInt(); System.out.println(num); //} } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { new Server(); } }
package socket; import java.io.DataInputStream; import java.io.DataOutputStream; import java.net.Socket; public class Client { public static void main(String[] args) throws Exception { System.out.println("--client--"); //Socket(,)内参数分别设为服务端IP和端口 Socket socket = new Socket("localhost", 8000); DataInputStream input = new DataInputStream(socket.getInputStream()); DataOutputStream output = new DataOutputStream(socket.getOutputStream()); int x = 222; output.writeInt(x); System.out.println("data convented:"+x); } }
服务端输出(执行之后显示红点,表示等待中...):
server start at:Sat Aug 15 19:39:40 CST 2015 connected with address:127.0.0.1 222
客户端输出:
--client-- data convented:222
3.实例二【Server->Client(1:n)】
package socket; import java.io.DataInputStream; import java.io.DataOutputStream; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.util.Date; public class SuperServer { private int countOfClient=0; public SuperServer() { try { ServerSocket serverSocket = new ServerSocket(8000); System.out.println("server start at:" + new Date()); while (true) { Socket socket = serverSocket.accept(); InetAddress address = socket.getInetAddress(); System.out.println("connected with address:" + address.getHostAddress()); //为每一位Client创建一个单独的线程 new Thread(new ConnectTask(socket)).start(); countOfClient++; System.out.println("this is the "+countOfClient + "(th) of client. "); } } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { new SuperServer(); } class ConnectTask implements Runnable { private Socket socket = null; public ConnectTask(Socket socket) { this.socket = socket; } @Override public void run() { try { DataInputStream input = new DataInputStream( socket.getInputStream()); DataOutputStream output = new DataOutputStream( socket.getOutputStream()); int numFromClient = input.readInt(); System.out.println("number from client:"+numFromClient); } catch (Exception e) { e.printStackTrace(); } } } }
以上代码中,服务端创建多线程,给每一个对接的客户端分一个独立的线程;客户端代码不变,还是实例一的代码。程序输出跟实例一近似,只不过这是服务端一直运行着,可供多个客户端连接。(因为独立分配线程,程序运行时资源比较浪费,所以代码仅供参考,有待优化!)
相关文章推荐
- Java日志框架——JCL(Log4J,Java Logging API)转SLF4J过程中重复依赖冲突问题
- 原代码,反码,解释和具体的补充 Java在>>和>>>差异
- 用代码简单介绍java中的异常的捕获及处理
- 《JAVA设计模式》之适配器模式
- eclipseIDE for javaee developers 开发环境搭建详解图文
- eclipseIDE for javaee developers 开发环境搭建详解图文
- return finally
- java NIO、BIO、AIO全面剖析
- Struts2的优点
- zoj3344 第一类斯特林数+java大数
- struts.xml在Action配置具体解释
- SpringMVC 基础教程 框架分析
- JavaSE基础--(四)异常处理
- 正确移除List中对象
- Spring Boot遇上jello
- Spring与Struts2集成开发
- Android环境结构--安装Eclipse错
- Eclipse 4.2 安装Java反编译插件
- Eclipse 4.2 安装Java反编译插件
- java 排错的技巧