标签:common play 项目管理 return scripts disable new t 接收 推荐
近期几天复习了下java网络编程socket使用我认为尽管以下的内容非常基础可是假设想要做出个好的东西想要高速掌握以后要学习的先要把基础打牢
假设基础打得好那么将来学习新的知识会非常快。事实上都是同理的。
假设大神能发挥下,拓展下完好下功能那就更好了,请在以下留下您的想法我会一直维护我的这些文章。
TCP 协议基础
IP协议是Internet的使用的一个关键协议,全称是Internet Protocol。即Internet协议通常简称IP协议通过IP协议,从而使Internet成为一个同意连接不同类型计算机的不同操作系统的网络。假设想要两台计算机通信那么就要使用同样的语言 那么就是用IP协议可是仅仅保证计算机能发送接受分组数据,IP协议负责将消息从一个主机发送到还有一个主机。消息在传送过程中被切割成包。
可是这样仅仅是攻克了他们之间的发送和接收数据可是还不能解决数据分组在传输数据过程中出现的问题。所以就须要使用TCP协议以保证提供可靠而且无差错的通信服务。
TCP协议是面向连接的端对端的协议。这是由于他对两台计算机之间的链接起到了关键的数据建立的链接用于发送和接收数据的虚拟链路
TCP和IP协议的功能尽管不尽同样,也能够分开使用。可是他们是在同一时期作为一个协议来设计的。而且在功能上也是互补的。
仅仅有两者结合起来才干保证internet在复杂的环境下正常的执行凡事要连接到internet的计算机都必须同一时候安装和使用这两个协议因此唱吧这两个协议叫做TCP/IP协议
使用serverSocket创建TCP服务器端
在两个通信实体之间没有建立虚拟链路之前必须先有一个通信实体先做出“主动姿态”主动地接受来自其它实体的连接请求。Java中接收其它的通信实体连接请求的类是ServerSocket,serverSocket用于监听来自socket端的连接,假设没有连接,他将一直处于等待状态。serverSocket包括一个监听来自client请求的方法
Socket accept():假设接收到一个client的Socket的链接的请求,该方法返回一个与client相应的socket否则该方法一直处于等待状态线程也被堵塞
为了创建serversocket对像,提供了例如以下几个构造器
serverSocket(int port)指定的port创建一个serverSocket对像该port应该有一个有效的port整数
serverSocket(int port,int backlog):添加一个用来改变连接队列长度的參数backlog
当serverSocket使用完成后,应使用serverSocket的close()方法关闭该serverSocket。
在通常情况下
服务器不用改制接受一个client的请求,而应该不断地接受来自client的全部的请求,所以java程序一般会循环的不断的调用serverSocket的accept()方法
使用socket进行通信
client通常能够使用socket的构造器连接到指定的server。socket通常能够使用给定的两个构造器连接到对应的主机或者是对应的IP地址的server这样就能实现对话
--
增加多线程
前面的Server和Client仅仅是进行了简单的通信操作:server端接收到client的连接之后。server端向client输出了一个字符串,而客户但也仅仅是读取server端的字符串后就退出了。实际应用中的client可能依据须要和server端保持长时间通信。即server端须要不断的读取client数据,并向client写入数据。client也须要不断的读取server端的数据,并向server端写入数据。
在使用传统的BufferReader的readLine()方法读取数据时,在该方法成功返回之前,线程被堵塞。程序无法运行。考虑到这个因素,server端应该为每一个Socket启动一个线程。每一个线程负责与一个client进行通信
client读取server端数据的县城相同会被堵塞。所以系统应该单独启动一个线程。
该线程专门负责读取server端的数据。
如今考虑实现一个命令行的界面的C/S聊天室应用,server端应该包括多个线程,每一个Socket相应一个线程,该线程负责读取Socket相应输入流的数据。并将读取到的数据向每一个Socket输出流发送一次(将一个client的数据广播给其它client)须要在server端使用list保存全部的Socket
server端的实现:
<span style="font-size:18px;"><span style="font-size:18px;">package com.example.administrator.openinternet; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; /** * Created by Administrator on 2015/7/23. * server端的程序 */ public class javaSocket { public static List<Socket> socketList = Collections.synchronizedList(new ArrayList<Socket>()); public static void main (String [] args) throws IOException { ServerSocket ss = new ServerSocket(30000); while(true) { Socket s = ss.accept(); socketList.add(s); new Thread( new ServerThread(s)).start(); } } } </span></span>
<span style="font-size:18px;"><span style="font-size:18px;">package com.example.administrator.openinternet; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.Socket; import java.net.SocketException; /** * Created by Administrator on 2015/7/23. * server端的线程 */ public class ServerThread implements Runnable { Socket s = null; BufferedReader br = null; public ServerThread(Socket s){ this.s = s ; try { br = new BufferedReader(new InputStreamReader(s.getInputStream()));//创建并读取流 } catch (IOException e) { e.printStackTrace(); } } /** * Starts executing the active part of the class' code. This method is * called when a thread is started that has been created with a class which * implements {@code Runnable}. */ @Override public void run() { try { String content = null; while ((content = readFromClient())!=null) { for(Socket s:javaSocket.socketList) { PrintStream ps = new PrintStream(s.getOutputStream()); } } }catch (IOException e) { e.printStackTrace(); } } private String readFromClient() { try { return br.readLine(); }catch (IOException e) { e.printStackTrace(); javaSocket.socketList.remove(s);//移除socketList中的数据三 } return null; } } </span></span>client实现:
<span style="font-size:18px;">package com.example.administrator.openinternet; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.Socket; /** * Created by Administrator on 2015/7/23. * 我的client的程序 */ public class MyClient { public static void main(String [] args) throws IOException { Socket s = new Socket("127.0.0.1",30000); new Thread( new ClientThread(s)).start(); PrintStream ps = new PrintStream(s.getOutputStream()); String line = null; BufferedReader br = new BufferedReader( new InputStreamReader(System.in)); while ((line = br.readLine())!=null) { ps.println(line); } } } </span>
<span style="font-size:18px;">package com.example.administrator.openinternet; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket; /** * Created by Administrator on 2015/7/23. * client的线程 */ public class ClientThread implements Runnable { private Socket s ; BufferedReader br = null; public ClientThread(Socket s) throws IOException { this.s = s ; br = new BufferedReader(new InputStreamReader(s.getInputStream())); } /** * Starts executing the active part of the class' code. This method is * called when a thread is started that has been created with a class which * implements {@code Runnable}. */ @Override public void run() { try { String content = null; while ((content = br.readLine())!=null) { System.out.println(content); } }catch (Exception e) { e.printStackTrace(); } } } </span>
??下载地址:http://www.pidgin.im/??在线使用手冊:http://developer...
实际上。普通的网络监控软件都可以提供支持实时监控Nginx的功能,比方Nagios、Zabbix和Munin。 ...
!小弟毕业设计,须要在嵌入式Webserver(我移植的Goahead)上编写一个界面,实现可以调用自己编写的一个读取传感器数据的命令行程序,因为刚接触这个方面。不知道怎样实现,自己苦闷了好...
1条评论