JAVA语言网络基础Socket通信基础
小标 2019-01-09 来源 : 阅读 1031 评论 0

摘要:本文主要向大家介绍了JAVA语言网络基础Socket通信基础,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

本文主要向大家介绍了JAVA语言网络基础Socket通信基础,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。


一、网络基础


1、InetAddress


InetAddress构造器私有,可以通过多种方式获得inetAddress对象



InetAddress ip = InetAddress.getLocalHost();//获取本机IP


ip = InetAddress.getByName("100.64.141.89");//通过名字获取指定地址IP


String name = ip.getHostName();//通过IP获取IP名字




2、URL统一资源定位符


典型构成:1、网络协议(https://);2、主机地址(192.168.46.20/myServlet);3、端口号(80);4、资源路径(crm/index.jsp);5、查询地址(gid=117)



//构造器多种,可以采用指定URL连接构造一个URL,也可以使协议,用端口号,文件名等信息构成URL


String str = "https://192.168.46.254:8888/easyBuy/crm/index.jsp";


URL url = new URL(str);


String protocol = url.getProtocol();// 获取协议


String host = url.getHost();// 主机名


int port = url.getPort();//端口号




对资源文件的一般操作



String file = url.getFile();//获取资源中包含的文件名称


InputStream is = url.openStream();//打开此URL连接(URLConnection),并获取连接的输入流(URLconnection.getOutputStream())




对URL地址进行转码,解码,防止乱码



String str1 = URLEncoder.encode(str, "UTF-8");//对str字符串进行UTF-8转码


 


String str2 = URLDecoder.decode(str1, "UTF-8");//解码




3、HttpURLConnection


继承URLConnection类;Http协议简介 http是一个无状态协议,请求、响应协议由请求头和响应头构成 。


①请求头: 请求方法:get post deleteput.....


②响应头 响应状态码:status code:200(正常响应) 400~(404,405请求资源异常,不存在,请求响应格式不一致) 500~(500服务器内部异常)



//利用HttpURL协议下载文件


String str3 = "https://192.168.46.254:8888/easyBuy/images/plmm.jpg";


URL url2 = new URL(str3);


// 打开一个URL连接


HttpURLConnection conn = (HttpURLConnection) url2.openConnection();//获取一个连接(URLConnection)


// 设置请求方法


//conn.setRequestMethod("GET");


// conn.setRequestProperty("Accep-Language", "zh-en");


//conn.setReadTimeout(10000);// 设置读取超时时间,可以默认


// conn.setDoInput(true);// 打开输入和输出,可以不设置,默认true


//conn.setDoOutput(true);


//int code = conn.getResponseCode();// 获取响应状态码


// System.out.println(code);


// 判断是否响应成功


if (code == HttpURLConnection.HTTP_OK) {


InputStream is1 = conn.getInputStream();


FileOutputStream fileOutputStream = new FileOutputStream(new File("C:\\Users\\lx\\Desktop\\test\\mn.jpg"));


BufferedInputStream bfi = new BufferedInputStream(is1);


BufferedOutputStream bfo = new BufferedOutputStream(fileOutputStream);


int len;


byte[] bs = new byte[1024];


while((len=bfi.read(bs))!=-1){


bfo.write(bs, 0, len);


bfo.flush();


}


}




 


 


二、Socket通讯:


1、TCP/IP



 

IP:InternetProtocol 网络协议,支撑主机之间通讯的基本协议,如果需要实现主机之间的消息安全传输,通常会结合TCP协议共同使用。全称为TCP/IP。都是传输层协议。


 

TCP:传输控制协议,能保证数据消息的在主机之间安全传输,三次握手,四次挥手。是一个安全传输数据协议,所以一般用于数据传输的准确性,安全性较高的应用,但是效率较低,如:视频通话。


 

 


 

C/S 架构: Client/Server 客户端/服务器模式


 

B/S 架构: Browser/Server 浏览器/服务器模式


 

 


 

服务器端:


 

1、创建serverSocket,此套接字为服务器专用,构造器应当包含端口号,以供其他主机连接。


 

2、监听套接字,并获得连接:Socket socket = serverSocket.accept( );


 

3、获取套接字输出流:socket.getOutputStream( );




ServerSocket serverSocket = new ServerSocket(9999);


System.out.println("服务器开启");


while (true) {


Socket socket = serverSocket.accept();


System.out.println("客户端已经连接" + socket.getInetAddress());


PrintStream ps = new PrintStream(socket.getOutputStream());


ps.print("欢迎使用socket服务器");


}




客户端


1、利用构造器获取以供连接的套接字,属性包含目标IP和端口号


2、获取套接字里面的输入流:socket.getInputStreeam( );



Socket socket = new Socket("127.0.0.1", 9999);


InputStreamReader isr = new InputStreamReader(socket.getInputStream());


BufferedReader br = new BufferedReader(isr);


String msg = br.readLine();


System.out.println(msg);




2、UDP



 UDP:user datagram Protocol 用户数据协议,无法保证数据的安全性,但是可以提交数据传输的效。


接收数据:为阻塞式,需要单独作为一个线程


1、创建网络通道datagramSocket,应当是包含端口地址的构造器


2、创建数据包datagramPacket ,其中构造方法必须包含一个空的字符缓冲区,偏移量等信息。


3、通过datagramSocket.receiver(datagramPacket);接受数据,向数据包写入数据。


4、获取数据包内容 new String(datagramPacket.getData() , datagramPacket.getOffset(),datagramPacket.getLength());



public static void main(String[] args) throws IOException {


DatagramSocket datagramSocket = new DatagramSocket(2345);


byte[] b = new byte[1024];


while (true) {


DatagramPacket datagramPacket = new DatagramPacket(b, b.length);


datagramSocket.receive(datagramPacket);//接受数据


String string = new String(datagramPacket.getData(), datagramPacket.getOffset(),


datagramPacket.getLength());


System.out.println("接受到的数据是" + string);


}


}




发送数据:


1、创建网络通道datagramSocket,构造器不需写入


2、创建数据包 datagramPacket,构造方法里面包含需要写入的字节数组,偏移量,目标地址,目标端口号,当然也可以通过set方式设置目标地址地址等信息


3、发送数据报 datagramSocket.send(datagramPacket);



public static void main(String[] args) throws IOException {


//创建一个网络通道


DatagramSocket datagramSocket = new DatagramSocket();


//将数据打包成数据报包


String message="nnnnnn";


 


DatagramPacket datagramPacket = new DatagramPacket(


message.getBytes(), message.getBytes().length,


InetAddress.getByName("192.168.46.19"),


2345);


datagramSocket.send(datagramPacket);


datagramSocket.close();


}




3、UDP多播广播


发送数据:


1、创建多播广播通道 new MulticastSocket( );


2、获取组播地址并将广播加入此地址 multicastSocket.jionGroup( InterAddress.getByName("266.81.9.8") );


3、构建datagramPacket,包含byte[]的内容,byte[]长度,ip,端口号。当然可以不用在构建方法添加ip和端口号。


4、发送消息:multicastSocket.send(datagramPacket);



public static void main(String[] args) throws IOException {


MulticastSocket multicastSocket = new MulticastSocket();


InetAddress group = InetAddress.getByName("226.81.9.8");


multicastSocket.joinGroup(group);


String content = "刷屏100遍";


 


DatagramPacket dp = new DatagramPacket(content.getBytes(),content.getBytes().length);


dp.setAddress(group);


dp.setPort(2426);


 


multicastSocket.send(dp);


}




接收数据:阻塞式,需要单独作为一个线程


1、创建多播广播通道:new MuliticastSocket(2426); 构造方法应当包含开启的端口号


2、获取广播地址,并加入此广播地址 muliticast.jionGroup(InterAddress.getByName("192.22.22.2"));


3、创建你个空的btye[]数组。和一个datdagramPacke对象。包含btye[]相关信息


4、接收数据:mutilicastSocket.receive(datagramPacket);


5、读取datagramPacket内容:利用String的构造方法



public static void main(String[] args) throws IOException {


MulticastSocket ms= new MulticastSocket(2426);


InetAddress group = InetAddress.getByName("226.81.9.8");


ms.joinGroup(group);


byte[] b = new byte[1024];


while (true) {


DatagramPacket datagramPacket = new DatagramPacket(b, b.length);


ms.receive(datagramPacket);//接受数据


String string = new String(datagramPacket.getData(), datagramPacket.getOffset(),


datagramPacket.getLength());


System.out.println(datagramPacket.getAddress()+"" + string);


}


 




4、NIO


NIO是jdk1.4之后引入的一套全新的IO API,处理数据的方式不同于传统IO,传统IO的处理数据的方式以字节为单位,而NIO是一个Buffer(数据块) 为单位,传统IO属于阻塞式(流在读取数据时如果未读到时,程序会处于阻塞状态);而NIO的处理的方式为非阻塞式方式允许(底层为信号通讯),NIO可以在单线程应用中处理多个客户请求。


          

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注编程语言JAVA频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程