JAVA Socket 编程
2016-05-16 16:09
351 查看
java.net包主要用于进行网络处理、Socket通信、Cookie、URI等网络通信解决方案。
今天主要抛块砖,对于网络编程这块内容进行一个简单的认知性总结。很浅显,网络编程大牛可绕过。
一、创建Socket客户端连接到服务器
2、获取客户端的输入信息,进行扫描,将数据输出。
执行过程;
1、执行new Socket初始化,调用套接字构造器,打开一个套接字,启动程序内外的通信。传入主机和端口(String host,int port)
2、getinputStream(返回一个inputStream对象)、getoutput 从套接字读取数据流,以及写出的数据流,可进行扫描输出等后续操作,这个就看具体业务需求。
但是这种直接传入host 和port 的方式,对于一般Socket初始化,如果连接失败则会一直阻塞,直到连接到host为止。所以一般采用先建立一个无连接的套接字,再设置一个超时时间,如果在给定时间没有相应,则返回。
二、实现服务器
客户端ok了,就可以创建一个简单的服务器,向客户端发送消息,启动后等待客户端连接到端口。
测试验证:
首先打开telnet 功能,一个windows自带的用于远程连接功能。程序-window功能-选择telnet客户端。打开之后就支持在命令符窗口执行telnet命令。
什么是Telnet?
对于Telnet的认识,不同的人持有不同的观点,可以把Telnet当成一种通信协议,但是对于入侵者而言,Telnet只是一种远程登录的工具。一旦入侵者与远程主机建立了 Telnet连接,入侵者便可以使用目标主机上的软、硬件资源,而入侵者的本地机只相当于一个只有键盘和显示器的终端而已。
为什么需要telnet?
telnet就是查看某个端口是否可访问。我们在搞开发的时候,经常要用的端口就是 8080。那么你可以启动服务器,用telnet 去查看这个端口是否可用。
详参见telnet 命令使用方法详解,telnet命令怎么用?
1、输入 telnet 127.0.0.1 1209 连接到创建好的服务器 ,如果连接失败,会提示拒绝连接。
2、连接成功后,进入telnet界面会输出程序中的Im Max 字符
3、回车,client后输入h,关闭连接。
三、多客户端支持
当打开两个客户端,一个输出了数据,一个并没有。所以上边的服务器还仅限于对单客户端访问。利用多线程,稍微改造一下。
四、总结
Socket编程主要应用于网络通信,P2P通信中应用,在这方面基本笔者属于0开发经验,本文也纯属扫盲级应用。java web的开发中也对这方面有所应用,不过是封装好的,对一般开发不可见。
另外,在维护一个数据传输项目中,有设计到Socket编程,当时是组内一个c++大牛写了一套实现,用于对大量数据进行接收、过滤,传送给上层服务。哎,反正,应该还比较重要,有时间可以研究一下。
今天主要抛块砖,对于网络编程这块内容进行一个简单的认知性总结。很浅显,网络编程大牛可绕过。
一、创建Socket客户端连接到服务器
try (Socket s=new Socket(host,port){ InputStream inStream=s.getInputStream(); Scanner in=new Scanner(inStream); while(in.hasNextLine()) { String line=in.nextLine(); System.out.println(line); }1、创建一个Socket对象,传入主机名/ip,和端口号。
2、获取客户端的输入信息,进行扫描,将数据输出。
执行过程;
1、执行new Socket初始化,调用套接字构造器,打开一个套接字,启动程序内外的通信。传入主机和端口(String host,int port)
2、getinputStream(返回一个inputStream对象)、getoutput 从套接字读取数据流,以及写出的数据流,可进行扫描输出等后续操作,这个就看具体业务需求。
但是这种直接传入host 和port 的方式,对于一般Socket初始化,如果连接失败则会一直阻塞,直到连接到host为止。所以一般采用先建立一个无连接的套接字,再设置一个超时时间,如果在给定时间没有相应,则返回。
Socket s=new Socket(); s.connect(new InetSocketAddress(host,post),timeout);java隐藏了建立网络连接、发送数据的复杂过程,使得Socket类非常简单易用。
二、实现服务器
客户端ok了,就可以创建一个简单的服务器,向客户端发送消息,启动后等待客户端连接到端口。
//建立Socket服务器 try(ServerSocket s=new ServerSocket(1209)) { try(Socket incoming=s.accept())// { InputStream inStream=incoming.getInputStream(); OutputStream outStream=incoming.getOutputStream(); try(Scanner in=new Scanner(inStream)) { PrintWriter out=new PrintWriter(outStream,true); out.println("hello ,I'm Max"); //将服务器输出返回给客户端作为输入 boolean done=false; while(!done && in.hasNextLine()) { String line=in.nextLine(); out.println("client:"+line); if(line.trim().equals("h")) done=true; } } }SocketServer的accept方法作用在于告诉程序不停地等待直到有客户端连接到这个端口,有连接返回一个已经建立好的sock对象。然后可以根据这个socket对象获取它的输入输出流。服务器发送给服务器端的所有信息都会成会客户端获取的数据。
测试验证:
首先打开telnet 功能,一个windows自带的用于远程连接功能。程序-window功能-选择telnet客户端。打开之后就支持在命令符窗口执行telnet命令。
什么是Telnet?
对于Telnet的认识,不同的人持有不同的观点,可以把Telnet当成一种通信协议,但是对于入侵者而言,Telnet只是一种远程登录的工具。一旦入侵者与远程主机建立了 Telnet连接,入侵者便可以使用目标主机上的软、硬件资源,而入侵者的本地机只相当于一个只有键盘和显示器的终端而已。
为什么需要telnet?
telnet就是查看某个端口是否可访问。我们在搞开发的时候,经常要用的端口就是 8080。那么你可以启动服务器,用telnet 去查看这个端口是否可用。
详参见telnet 命令使用方法详解,telnet命令怎么用?
1、输入 telnet 127.0.0.1 1209 连接到创建好的服务器 ,如果连接失败,会提示拒绝连接。
2、连接成功后,进入telnet界面会输出程序中的Im Max 字符
3、回车,client后输入h,关闭连接。
三、多客户端支持
当打开两个客户端,一个输出了数据,一个并没有。所以上边的服务器还仅限于对单客户端访问。利用多线程,稍微改造一下。
class ThreadedEchoHandler implements Runnable { public ThreadedEchoHandler(Socket i) { incoming = i; } public void run() { try { try { InputStream inStream = incoming.getInputStream(); OutputStream outStream = incoming.getOutputStream(); Scanner in = new Scanner(inStream); PrintWriter out = new PrintWriter(outStream, true ); out.println( "Hello!I m Max" ); boolean done = false; while (!done && in.hasNextLine()) { String line = in.nextLine(); out.println("client: " + line); if (line.trim().equals("h")) done = true; } } finally { incoming.close(); } }catch(Exception e) { e.printStackTrace(); } } private Socket incoming; } public static void main(String[] args) throws IOException { //建立Socket服务器 try { int i=1; ServerSocket s=new ServerSocket(1209); while(true) { Socket incoming=s.accept(); Runnable r = new ThreadedEchoHandler(incoming); Thread t = new Thread(r); t.start(); i++; } }catch(Exception e) { e.printStackTrace(); } }跟二中服务端的不同就在于创建了一个多线程类,用于执行不同的客户端访问任务。
四、总结
Socket编程主要应用于网络通信,P2P通信中应用,在这方面基本笔者属于0开发经验,本文也纯属扫盲级应用。java web的开发中也对这方面有所应用,不过是封装好的,对一般开发不可见。
另外,在维护一个数据传输项目中,有设计到Socket编程,当时是组内一个c++大牛写了一套实现,用于对大量数据进行接收、过滤,传送给上层服务。哎,反正,应该还比较重要,有时间可以研究一下。
相关文章推荐
- 解决更改JAVA_HOME后jdk版本没有更改问题
- 图文介绍如何在Eclipse统计代码行数
- java提高篇(五)-----使用序列化实现对象的拷贝
- Java Date Compare
- Java集合Collection总结
- Spring 定时任务注意点
- Java应用SAX方式解析XML
- In eclipse: A child container failed during start and Failed to start components
- In eclipse: A child container failed during start and Failed to start components
- 【38】java的集合框架(容器框架)
- 【38】java的集合框架(容器框架)
- 【38】java的集合框架(容器框架)
- javaEE链接传值乱码的一个处理方法
- java内存泄漏的定位与分析
- 【第十一章】 SSH集成开发积分商城 之 11.3 实现积分商城层 ——跟我学spring3
- 详细介绍Spring事务管理
- 对Spring对Hibernate事务管理的简单理解
- Callable, Future和FutureTask简述
- JAVA性能调优点滴
- 深入解析Java中ThreadLocal线程类的作用和用法