您的位置:首页 > 编程语言 > Java开发

JAVA Socket 编程

2016-05-16 16:09 351 查看
java.net包主要用于进行网络处理、Socket通信、Cookie、URI等网络通信解决方案。

今天主要抛块砖,对于网络编程这块内容进行一个简单的认知性总结。很浅显,网络编程大牛可绕过。

一、创建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++大牛写了一套实现,用于对大量数据进行接收、过滤,传送给上层服务。哎,反正,应该还比较重要,有时间可以研究一下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: