Java Socket应用---通信是这样练成的
网络基础简介
Java 中网络相关 API 的应用
- Java 中的 InetAddress 的应用
Test01.java
package com.imooc; import java.net.InetAddress; import java.util.ArrayList; import java.util.Arrays; public class Test01 { /** * InetAddress **/ public static void main(String[] args) throws Exception { // 获取本机的InetAddress实例 InetAddress address=InetAddress.getLocalHost(); System.out.print("计算机名:"+address.getHostName()); System.out.println("/IP地址:"+address.getHostAddress()); System.out.println("********************************************"); //获取字节数组形式的IP地址 byte[] bytes=address.getAddress(); System.out.println("字节数组形式的IP:"+Arrays.toString(bytes)); //直接输出InetAddress对象 System.out.println(address); System.out.println("********************************************"); //根据机器名获取InetAddress实例 InetAddress address2=InetAddress.getByName("PC-mashuangying"); System.out.print("计算机名:"+address2.getHostName()); System.out.println("/IP地址:"+address2.getHostAddress()); System.out.println("********************************************"); InetAddress address3=InetAddress.getByName("192.168.1.103"); System.out.print("计算机名:"+address2.getHostName()); System.out.println("/IP地址:"+address2.getHostAddress()); System.out.println("********************************************"); } }
运行结果为:
- Java中的URL的应用
Test02.java
package com.imooc; import java.net.URL; public class Test02 { /** * @URL */ public static void main(String[] args) throws Exception{ // 创建一个URL的实例 URL imooc=new URL("http://www.imooc.com"); URL url=new URL(imooc,"index.html?username=tom#test");//?后面表示参数#后面表示 System.out.println("协议:"+url.getProtocol()); System.out.println("主机:"+url.getHost()); //如果未指定端口号,则使用默认的端口号,此时getPort()方法返回值为-1 System.out.println("端口:"+url.getPort()); System.out.println("文件路径:"+url.getPath()); System.out.println("文件名:"+url.getFile()); System.out.println("相对路径:"+url.getRef()); System.out.println("查询字符串:"+url.getQuery()); } }
运行结果为:
Test03.java
package com.imooc; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; public class Test03 { /** * @使用URL读取页面内容 */ public static void main(String[] args) throws Exception{ // 创建一个URL实例 URL url=new URL("https://www.baidu.com"); //通过URL的openStream方法获取URL对象所表示的资源的字节输入流 InputStream is=url.openStream(); //将字节输入流转换为字符输入流 InputStreamReader isr=new InputStreamReader(is,"UTF-8"); BufferedReader br=new BufferedReader(isr); //为字符输入流添加缓冲 String data=br.readLine();//读取数据 while (data!=null) {//循环读取数据 System.out.println(data);//输出数据 data=br.readLine(); } br.close(); isr.close(); is.close(); } }
运行结果为:
<!DOCTYPE html> <!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class="head_wrapper"> <div class="s_form"> <div class="s_form_wrapper"> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class="fm"> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class="s_ipt" value maxlength=255 autocomplete=off autofocus=autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn" autofocus></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class="mnav">新闻</a> <a href=https://www.hao123.com name=tj_trhao123 class="mnav">hao123</a> <a href=http://map.baidu.com name=tj_trmap class="mnav">地图</a> <a href=http://v.baidu.com name=tj_trvideo class="mnav">视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class="mnav">贴吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class="lb">登录</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录</a>'); </script> <a href=//www.baidu.com/more/ name=tj_briicon class="bri" style="display: block;">更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>©2017 Baidu <a href=http://www.baidu.com/duty/>使用百度前必读</a> <a href=http://jianyi.baidu.com/ class="cp-feedback">意见反馈</a> 京ICP证030173号 <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>
通过 Socket 实现 TCP 编程
Server.java(服务端)
package com.imooc; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; /* *基于TCP协议的Socket通信,实现用户登录 *服务器端 * */ public class Server { public static void main(String []args) throws Exception{ //1.创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口 ServerSocket serverSocket=new ServerSocket(8888); System.out.println("***服务器即将启动,等待客户端的连接***"); //2.调用accept()方法开始监听,等待客户端的连接 Socket socket= serverSocket.accept(); //3.获取输入流,并读取客户端信息 InputStream is=socket.getInputStream();//字节输入流 InputStreamReader isr=new InputStreamReader(is);//将字节流转换为字符流 BufferedReader br=new BufferedReader(isr);//为输入流添加缓冲 String info=null; while ((info=br.readLine())!=null) {//循环读取客户端的信息 System.out.println("我是服务器,客户端说:"+info); } socket.shutdownInput();//关闭输入流 //4.获取输出流,响应客户端的请求 OutputStream os=socket.getOutputStream(); PrintWriter pw=new PrintWriter(os);//包装为打印流 pw.write("欢迎您!"); pw.flush();//调用flush()方法将缓冲输出 //5.关闭资源 pw.close(); os.close(); br.close(); is.close(); isr.close(); socket.close(); serverSocket.close(); } }
Client.java(客户端)
package com.imooc; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; /* * 客户端 */ public class Client { public static void main(String []args) throws Exception{ //1.创建客户端Socket,指定服务器地址和端口 Socket socket=new Socket("localhost",8888); //获取输出流,向服务器端发送信息 OutputStream os=socket.getOutputStream();//字节输出流 PrintWriter pw=new PrintWriter(os);//将输出流包装为打印流 pw.write("用户名:admin;密码:123"); pw.flush(); socket.shutdownOutput();//关闭输出流 //3.获取输入流,并读取服务端的响应信息 InputStream is=socket.getInputStream(); BufferedReader br=new BufferedReader(new InputStreamReader(is)); String info=null; while ((info=br.readLine())!=null) { System.out.println("我是客户端,服务器说:"+info); } //4.关闭资源 br.close(); is.close(); os.close(); pw.close(); socket.close(); } }
运行结果为:
第一步:先执行(Server.java(服务端) )
第二步:执行(Client.java(客户端))
Server.java
package com.imooc; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; /* *基于TCP协议的Socket通信,实现用户登录 *服务器端 * */ public class Server { public static void main(String []args) throws Exception{ //1.创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口 ServerSocket serverSocket=new ServerSocket(8888); Socket socket=null; int count=0; System.out.println("***服务器即将启动,等待客户端的连接***"); //循环监听等待客户端的连接 while (true) { //2.调用accept()方法开始监听,等待客户端的连接 socket=serverSocket.accept(); //创建一个新的线程 ServerThread serverThread=new ServerThread(socket); //启动线程 serverThread.start(); count++; System.out.println("客户端的数量:"+count);//统计客户端的数量 InetAddress address=socket.getInetAddress(); System.out.println("当前客户端的IP:"+address.getHostAddress()); } } }
Client.java
package com.imooc; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; /* * 客户端 */ public class Client { public static void main(String []args) throws Exception{ //1.创建客户端Socket,指定服务器地址和端口 Socket socket=new Socket("localhost",8888); //获取输出流,向服务器端发送信息 OutputStream os=socket.getOutputStream();//字节输出流 PrintWriter pw=new PrintWriter(os);//将输出流包装为打印流 //pw.write("用户名:admin;密码:123"); pw.write("用户名:tom;密码:133"); pw.flush(); socket.shutdownOutput();//关闭输出流 //3.获取输入流,并读取服务端的响应信息 InputStream is=socket.getInputStream(); BufferedReader br=new BufferedReader(new InputStreamReader(is)); String info=null; while ((info=br.readLine())!=null) { System.out.println("我是客户端,服务器说:"+info); } //4.关闭资源 br.close(); is.close(); os.close(); pw.close(); socket.close(); } }
ServerThread.java
package com.imooc; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; /** * 服务器线程处理类 */ public class ServerThread extends Thread { Socket socket=null; public ServerThread(Socket socket) { super(); this.socket = socket; } //线程执行的操作,响应客户端的请求 public void run() { InputStream is=null; InputStreamReader isr=null; BufferedReader br=null; OutputStream os=null; PrintWriter pw=null; try { //获取输入流,并读取客户端信息 is = socket.getInputStream(); isr = new InputStreamReader(is); br = new BufferedReader(isr); String info = null; while ((info = br.readLine()) != null) {// 循环读取客户端的信息 System.out.println("我是服务器,客户端说:" + info); } socket.shutdownInput();// 关闭输入流 //获取输出流,响应客户端的请求 os = socket.getOutputStream(); pw = new PrintWriter(os); pw.write("欢迎您!"); pw.flush();// 调用flush()方法将缓冲输出 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try { // 5.关闭资源 if (pw!=null) { pw.close(); } if (os!=null) { os.close(); } if (br!=null) { br.close(); } if (isr!=null) { isr.close(); } if (is!=null) { is.close(); } if (socket!=null) { socket.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static void main(String[] args) { // TODO Auto-generated method stub } }
运行结果为:
第一步:运行(Server.java)
第二步:运行(Client.java)
第三步:服务器接收客户端的请求
通过 Socket 实现 UDP 编程
- UDP编程
1.UDP协议(用户数据报协议)是无链接、不可靠的、无序的
2.UDP协议以数据报作为数据传输的载体
相关操作类
DatagramPacket:表示数据
DatagramSocket:进行端到端通信的类
UDPServer.java
package com.imooc; /* * UDP服务端 */ import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class UDPServer { /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { /* * 接收客户端发送的数据 */ // 1.创建服务器端DatagramSocket,指定端口 DatagramSocket socket=new DatagramSocket(8800); //2.创建数据报,用于接收客户端发送的数据 byte[] data=new byte[1024];//创建字节数组,指定接收的数据包的大小 DatagramPacket packet=new DatagramPacket(data, data.length); //3.接收客户端发送的数据 System.out.println("***服务器端已经启动,等待客户端发送数据***"); socket.receive(packet);//此方法在接收到数据报之前会一阻塞 //4.读取数据 String info=new String (data,0,packet.getLength()); System.out.println("我是服务器,客户端说:"+info); /* * 客户端响应数据 */ //1.定义客户端的地址,端口号、数据 InetAddress address=packet.getAddress(); int port=packet.getPort(); byte[] data2="欢迎您!".getBytes(); //2.创建数据报,包含响应的数据信息 DatagramPacket packet2=new DatagramPacket(data2, data2.length,address,port); //3.响应客户端 socket.send(packet2); //4.关闭资源信息 socket.close(); } }
UDPClient.java
package com.imooc; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.Socket; public class UDPClient { /** * 向服务器端发送数据 **/ public static void main(String[] args) throws Exception{ // 1.定义服务器的地址,端口号,数据 InetAddress address=InetAddress.getByName("localhost"); int port=8800; byte[] data="用户名:admin;密码:123".getBytes(); //2.创建数据报,包含发送的数据信息 DatagramPacket packet=new DatagramPacket(data, data.length,address,port); //创建DatagramPacket对象 DatagramSocket socket=new DatagramSocket(); //4.向服务器端发送数据报 socket.send(packet); /* * 接收服务器端响应的数据 * */ //1.创建数据报,用户接收服务器端响应的数据 byte[] data2=new byte[1024]; DatagramPacket packet2=new DatagramPacket(data2, data2.length); //2.接收服务器响应的数据 socket.receive(packet2); //3.读取数据 String reply=new String(data2,0,packet2.getLength()); System.out.println("我是客户端,服务器说:"+reply); //4.关闭资源 socket.close(); } }
运行结果为:
第一步:执行(UDPServer.java)
第二步:执行(UDPServer.java)
第三步:
Java Socket应用---通信是这样练成的的更多相关文章
- Java Socket编程----通信是这样炼成的
Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Socket.像大家熟悉的QQ.MSN都使用了Socket相关的技术. ...
- 慕课网_Java Socket应用---通信是这样练成的
第1章 网络基础知识 1-1 网络基础简介 (10:21) 第2章 Java 中网络相关 API 的应用 2-1 Java 中的 InetAddress 的应用 (08:10) import java ...
- java socket报文通信(一)socket的建立
java socket报文通信(一) socket的建立 今天来和大家分享一下java中如何使用socket进行通信.先来啰嗦两句,看看Tcp/ip和udp: TCP是Transfer Contro ...
- java socket线程通信
关于socket线程通信的一些知识整理 一般我们需要要让两台机子进行通信,需要创建一个Server 类,一个Client类,还需要创建一个线程类 server public class Server ...
- java socket报文通信(三)java对象和xml格式文件的相互转换
前两节讲了socket服务端,客户端的建立以及报文的封装.今天就来讲一下java对象和xml格式文件的相互转换. 上一节中我们列举了一个报文格式,其实我们可以理解为其实就是一个字符串.但是我们不可能每 ...
- java socket报文通信(一) socket的建立
TCP是Transfer Control Protocol的 简称,是一种面向连接的保证可靠传输的协议.通过TCP协议传输,得到的是一个顺序的无差错的数据流.发送方和接收方的成对的两个socket之间 ...
- java socket报文通信(二)报文的封装
昨天我们谈了怎么建立socket通信的服务端和客户端,今天我们就来谈一谈怎么封装报文. 什么是报文这里我就不在阐述了,不清楚的朋友可以自己去查资料.我们今天要谈的报文主要友以下几个部分组成: 3位同步 ...
- Java Socket编程基础篇
原文地址:Java Socket编程----通信是这样炼成的 Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Sock ...
- JAVA通信系列一:Java Socket技术总结
本文是学习java Socket整理的资料,供参考. 1 Socket通信原理 1.1 ISO七层模型 1.2 TCP/IP五层模型 应用层相当于OSI中的会话层,表示层, ...
随机推荐
- SQL AlawaysOn 之二:添加组织和域用户
1.在管理工具打开Active Directory 用户和计算机 2.在域控制器名称下面右键 选择 新建--组织单位, 3.输入组织名定,点确定 4.在组织右键--新建--用户 5.输入用户信息,点 ...
- 配置Windows Server 2012服务器远程连接支持多人同时登陆
1.运行输入gpedit.msc 进入组策略 2.计算机配置--管理模版--windows组件--远程桌面服务--远程桌面会话主机--连接 3.找到限制连接的数量,启用,并改为100. 4.找到 将远 ...
- 实验楼-4-Linux文件权限
$ ls -l /*查看文件权限*/ 每一行格式意思: <文件类型和权限 链接数 所有者 所在用户组 文件大小 上次修改时间 文件名> 文件类型和权限如下图: 解释: 软连接:类似于win ...
- ajax ----进度条的原理
一.进度条的原理 新知识点:Html5中FormData,xmlHttpRequest中的upload属性,progress事件监控 xmlHttpRequest中的upload属性,实现: < ...
- 关于微信小程序图片失真的解决方案
今天来说一说 关于微信小程序的图片失真问题的解决,微信小程序的image标签要设置其宽高,不然图片若宽高过大会撑开原始图片大小的区域:如下 但是宽高设置固定了会导致有些图片和规定显示图片大小的比例不一 ...
- 什么是node.js
1.0什么是nodejs 1.1定义: Node.js是Javascript除了浏览器之外可以运行的另一个环境(runtime).可以为我们提供开启服务功能和提供文件读写功能 1.2特点: 1)基于g ...
- Unix环境编程基础下
Unix出错处理 当UNIX系统的函数出错时,通常会返回一个负值.我们判断函数的返回值小于0表示出错了,注意我们并不知道为什么出错.例如我们open一个文件,返回值-1表示打开失败,但是为什么打开失败 ...
- android.util.Log常用方法
android.util.Log常用的方法有以下5个: Log.v() Log.d() Log.i() Log.w() 以及 Log.e() .根据首字母分别对应VERBOSE,DEBUG,INFO, ...
- 《ECMAScript标准入门》第二版读书笔记
title: <ECMAScript标准入门>第二版 date: 2017-04-10 tags: JavaScript categories: Reading-note 2015年6月, ...
- setTimeout 和 setInteval 的区别。
学习前端的可能都知道js有2个定时器setTimeOut和setinteval.用的时候可能不是很在意,但是2者还是有区别的 setTimeout方法是定时程序,也就是在什么时间以后干什么.干完就完了 ...