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中的会话层,表示层, ...
随机推荐
- 深入浅出数据结构C语言版(4)——表与链表
在我们谈论本文具体内容之前,我们首先要说明一些事情.在现实生活中我们所说的"表"往往是二维的,比如课程表,就有行和列,成绩表也是有行和列.但是在数据结构,或者说我们本文讨论的范围内 ...
- 第37篇 Asp.Net源码解析(二)--详解HttpApplication
这篇文章花了点时间,差点成烂到电脑里面,写的过程中有好几次修改,最终的这个版本也不是很满意,东西说的不够细,还需要认真的去看下源码才能有所体会,先这样吧,后面有时间把细节慢慢的再修改.顺便对于开发的学 ...
- 解决ubuntu更新中断后报错问题
今天在更新ubuntu的时候,更新了一半被我强制关闭了,就报错了 当再使用sudo apt-get update命令时出现了dpkg was interrupted,you must manually ...
- 从Properties得到数据到gson转换为json
从上一篇得到properties里的数据 Map<String,String> map = new HashMap<String,String>(); Enumeration& ...
- JIRA6.36-7.23数据迁移文档
JIRA6.3.6-JIRA7.2.3数据迁移文档 安装JIRA7.2.3 安装包位于服务器/opt/SOFTWARE_PACKAGE目录下 建立JIRA安装的目录数据目录 cd /opt mkdir ...
- dede织梦数据表字段解释
提示:常用字段,可以在dede后台->系统->SQL命令行工具,执行sql语句来批量修改 dede_addonarticle 附加文章表 aid int(11) 文章编号 ...
- 将ROS中的/sensor_msgs/NavSatFix数据导入google earth显示轨迹
将ros中的gps_msg数据导入google earth显示轨迹 [TOC] 1. 获取GPS数据 将ros中发布的gps topic输出到文本中 rostopic echo -p /gpsData ...
- 存储linux RAID6被重建成RAID5的数据恢复解决方案
数据恢复故障描述:原存储为12块2T硬盘组成的Linux RAID6,文件系统均为EXT3,此存储上划有3个LUN,每个均为6TB大小,某天在RAID失效后,维护人员为了抢救数据,对此失效的存储重进行 ...
- Myeclipse8.5开发-安装一:Myeclipse8.5注册码生成程序
环境:Myeclipces8.5 1.安装Myeclipces8.5. 2.打开Myeclipces新建任意项目. 3.新建MyEclipseKeyGen.java类.点击运行,控制台输入您的注册名, ...
- SQL编程的一些良好好习惯
|转载自:cnblog |原文链接:http://www.cnblogs.com/MR_ke/archive/2011/05/29/2062085.html 我们做软件开发的,大部分人都离不开跟数据库 ...