志在指尖
用双手敲打未来

javasocket(java socket编程实例)

javasocket

Socket是应用层与TCP/IP协议族通讯的中间笼统层,它是一组接口,应用层经过调用这些接口完成发送和接纳数据。一般这种笼统层由操作体系供给或许由JVM自己完成。运用socket能够简略地完成应用程序在网络上得通讯,一台机器上的应用想socket写入信息,别的一台相连的机器能读取到。TCP/IP协议族平分两种socket类型,别离是流套接字和数据报套接字,别离对应TCP协议和UDP协议。一个TCP/IP套接字由一个互联网地址,一个协议及一个端口号仅有确认。
如图2-3-1,socket笼统层在传输层与应用层之间,添加这一层是很有必要跟有用的,它类似于设计形式中的门面形式,用户没必要知道和处理杂乱的TCP/IP协议族业务逻辑的细节,这时socket就展现出它的优势了,它把这些杂乱处理都隐藏在socket接口下面,它帮助用户解析安排TCP/IP协议族报文数据,以符合TCP/IP协议族,这样用户只要简略调用接口即可完成数据的通讯操作。
2、Java中socket
上面了解了什么是socket,那么socket在Java中又是怎样的?Java为TCP协议供给了两个类,别离为Socket和ServerSocket,一个代表客户端,一个代表服务器端。经过操作这两个类即可完成TCP协议通讯。而对于UDP协议,Java则对应供给了DatagramSocket类用于UDP协议通讯。
3、关于地址
既然要通讯,那必定触及要跟谁通讯,只有确认了你的方针地址是什么,才能将信息准确传递到正确的机器上。一般能够经过IP字符串或许主机名(例如www.baidu.com,这种方法是经过DNS进行解析成IP字符串)两种方法来确认一个方针地址。从前面的IP协议学习能够知道,IP地址实践是一个网络的地址,并非一个机器的地址,所以准确上说一台主机经过IP协议的衔接,其实是一台主机与IP所确认的那个网络之间的衔接。
在Java中,供给了一个InetAddress类来代表一个网络方针地址,包括IP属性跟主机名属性,IP一共有两个版别,别离是运用32位的IPv4和128位的IPv6,依据不同的IP协议版别,又衍生出两个子类,Inet4Address和Inet6Address。InetAddress对域名解析是运用本地机器配置或许网络命名服务(如域名体系DNS)来完成,InetAddress默认会缓存一段有限时刻的域名与IP地址的映射,这样拜访相同的地址就不需要重复发送DNS恳求,很大地提高了效率。InetAddress实例一旦创建了,就不行再改变,始终指向一个地址。在接下来要介绍的ServerSocket,Socket,DatagramSocket等等类都会用到这个类。java

javasocket编程实例

1.运用TCP衔接的demo
需要用到java.net.Socket和java.net.ServerSocket,具体可以查询API文档
创立Sever类和Client类作为demo
Server类的完成:
importjava.io.*;
importjava.net.ServerSocket;
importjava.net.Socket;
/**
*基于TCp的Socket通讯,完成用户登录
*服务器端
*/
publicclassServer{
publicstaticvoidmain(String[]args){
try{
//创立一个服务器socket,即serversocket,指定绑定的端口,并监听此端口
ServerSocketserverSocket=newServerSocket(8888);
//调用accept()方法开始监听,等候客户端的衔接
System.out.println(“***服务器即将启动,等候客户端的衔接***”);
Socketsocket=serverSocket.accept();
//获取输入流,并读入客户端的信息
InputStreamin=socket.getInputStream();//字节输入流
InputStreamReaderinreader=newInputStreamReader(in);//把字节输入流通换为字符流
BufferedReaderbr=newBufferedReader(inreader);//为输入流增加缓冲
Stringinfo=null;
while((info=br.readLine())!=null){
System.out.println(“我是服务器,客户端说:”+info);
}
socket.shutdownInput();//封闭输入流
//获取输出流,相应客户端的信息
OutputStreamoutputStream=socket.getOutputStream();
PrintWriterprintWriter=newPrintWriter(outputStream);//包装为打印流
printWriter.write(“欢迎您!”);
printWriter.flush();//刷新缓冲
socket.shutdownOutput();
//封闭资源
printWriter.close();
outputStream.close();
br.close();
inreader.close();
in.close();
socket.close();
serverSocket.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
Client类的完成:
importjava.io.*;
importjava.net.Socket;
/**
*客户端
*/
publicclassClient{
publicstaticvoidmain(String[]args){
//创立客户端socket建立衔接,指定服务器地址和端口
try{
Socketsocket=newSocket(“127.0.0.1”,8888);
//获取输出流,向服务器端发送信息
OutputStreamoutputStream=socket.getOutputStream();//字节输出流
PrintWriterpw=newPrintWriter(outputStream);//将输出流包装为打印流
pw.write(“用户名:admin;暗码:123”);
pw.flush();
socket.shutdownOutput();
//获取输入流,读取服务器端的呼应
InputStreaminputStream=socket.getInputStream();
BufferedReaderbr=newBufferedReader(newInputStreamReader(inputStream));
Stringinfo=null;
while((info=br.readLine())!=null){
System.out.println(“我是客户端,服务器说:”+info);
}
socket.shutdownInput();
//封闭资源
br.close();
inputStream.close();
pw.close();
outputStream.close();
socket.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
运转结果:(!!!!要先运转Server端)
2.运用UDP衔接的demo
要用到DatagramPacket和DatagramSocket
创立UDPServer和UDPClient类:
UDPSerer:
/**
*服务器端的完成
*/
importjava.io.IOException;
importjava.net.DatagramPacket;
importjava.net.DatagramSocket;
importjava.net.InetAddress;
importjava.net.SocketException;
publicclassUDPServer{
publicstaticvoidmain(String[]args){
try{
//服务器端接纳来自客户端的数据
//创立服务器端的DatagramSocket,指定端口
DatagramSocketsocket=newDatagramSocket(8800);
//创立数据报,用于接纳客户端发送的信息
byte[]data=newbyte[1024];//创立字节数组,指定接纳的数据包的大小
DatagramPacketpacket=newDatagramPacket(data,data.length);
//接纳客户端发送的数据
socket.receive(packet);//接纳到数据包之前会一向堵塞,会把数据存入packet的data
//读取数据
Stringinfo=newString(data,0,packet.getLength());//读取数据
System.out.println(“IamServer,Clientsay:”+info);
//接纳到数据后,服务器端呼应给客户端,根本与client的发送相同
//界说客户端的ip地址,端口号,数据
InetAddressaddress=packet.getAddress();
intport=packet.getPort();//port难道不应该肯定是8800???
byte[]data2=”Welcome”.getBytes();
DatagramPacketpacket1=newDatagramPacket(data2,data2.length,address,port);
socket.send(packet1);
socket.close();//封闭资源
}catch(SocketExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
UDPClient:
importjava.io.IOException;
importjava.net.*;
/**
*客户端完成
*/
publicclassUDPClient{
publicstaticvoidmain(String[]args){
try{
//界说服务器的ip,端口号,数据
InetAddressinetAddress=InetAddress.getByName(“localhost”);
intport=8800;
byte[]data=”用户名:admin;暗码:123″.getBytes();
//创立数据包,包括要发送的信息
DatagramPacketpacket=newDatagramPacket(data,data.length,inetAddress,port);
//创立datagramsocket
DatagramSocketsocket=newDatagramSocket();
//运用socket向服务器端发送数据包
socket.send(packet);
//socket.close();
//接纳服务器端的呼应,根本与Server的接纳相同
byte[]dataR=newbyte[1024];//创立数据包用于接纳服务器端的呼应
DatagramPacketpacket1=newDatagramPacket(dataR,dataR.length);
socket.receive(packet1);//接纳呼应的数据
Stringinfo=newString(dataR,0,packet1.getLength());//读取数据
System.out.println(“IamClient,Severreply:”+info);
socket.close();//封闭资源
}catch(UnknownHostExceptione){
e.printStackTrace();
}catch(SocketExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
运转结果:(先Server!)

未经允许不得转载:IT技术网站 » javasocket(java socket编程实例)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载