--------------------- android培训、java培训、java学习型技术博客、期待与您交流! ----------------------
网络通信步骤
1 找到对方IP
2 数据要发送到对方指定的应用程序上,为了标识这些程序,所以给这些网络应用程序用数字进行了标识,为了方便标识,叫做端口
3 定义一个通信规则,称之为协议
127.0.0.1本地回环地址
开放系统互联参考模型
TCP/IP参考模型
数据封包:按照每一层加上每一层的信息
数据拆包:
应用层:HTTP协议 FTP
传输层:TCP UDP
网络层:IP
我们要做的是用java操作IP,端口号,传输协议
publicstaticvoid main(String[] args) throws UnknownHostException {
InetAddress i = InetAddress.getLocalHost();
String name = i.getHostName();
String address = i.getHostAddress();
//以IP为主,因为主机名还需要解析
InetAddress j = InetAddress.getByName("www.baidu.com");
System.out.println(j.getHostName());
//如果该地址和对应的主机名不存在,则解析不成功于是名字还是IP地址
System.out.println(j.getHostAddress());
}
端口就是一个数字
UDP和TCP的区别
UDP:面向无连接,打包发送数据,每个包64K,不需要建立连接,速度快,不可靠
TCP:面向连接,数据传输量大,需要建立连接,速度慢效率低,可靠
三次握手
Socket编程:网络服务提供的一中机制
通信两端都有socket
数据两端通过IO传输
思路
发送端
1. 建立UDPsocket服务
2. 提供数据,封装到数据包
3. 通过socket服务发送功能,发送数据包
4. 关闭资源
publicstaticvoid main(String[] args) throws IOException {
//创建socket服务
DatagramSocket d = new DatagramSocket();
//确定数据封包
byte[] b = "asdsadasda".getBytes();
DatagramPacket d1 = new DatagramPacket(b, b.length, InetAddress.getByName("127.0.0.1"), 10000);
//发送数据
d.send(d1);
//关闭
d.close();
}
接收端(在定义接收端通常都会监听一个端口,其实就是给网络应用程序定义一个标识,方便明确哪些数据过来,该应用程序可以处理)
1. 定义socket服务
2. 定义一个数据包,用来存储接收到的字节数据,因为数据包对象中有更多功能可以提取字节数据中的不同数据信息
3. 通过socket服务的receive方法将收取的数据存入数据包
4. 解析数据包
5. 关闭资源
publicstaticvoid main(String[] args) throws IOException {
//创建socket接收点
DatagramSocket p = new DatagramSocket(10000);
//定义数据包存储数据
byte[] b = newbyte[1024];
DatagramPacket d = new DatagramPacket(b,b.length);
//接受数据
p.receive(d);
String ip = d.getAddress().getHostAddress();
String name = d.getAddress().getHostAddress();
String com = new String(d.getData(),0,d.getLength());
int port = d.getPort();
System.out.println(ip+"!"+name+"!"+port);
System.out.println(com);
}
键盘录入
publicstaticvoid main(String[] args) throws IOException {
//创建socket服务
DatagramSocket d = new DatagramSocket();
//确定数据封包
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
byte[] b = newbyte[1024];
//br.read(b);
String str = null;
while((str = br.readLine())!= null)
{
if("886".equals("line"))
break;
else
{
b = str.getBytes();
DatagramPacket d1 = new DatagramPacket(b, b.length, InetAddress.getByName("192.168.1.102"), 10000);
//发送数据
d.send(d1);
}
}
//关闭
d.close();
}
192.168.1.0 和192.168.1.255没法用 255是广播地址
多线程:一个线程接收数据,一个线程发送数据
山寨QQ
//发送端socket
class send implements Runnable
{
private DatagramSocket d;
public send(DatagramSocket d)
{
this.d = d;
}
@Override
publicvoid run() {
try
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = null;
while((str = br.readLine())!= null)
{
byte[] b = str.getBytes();
DatagramPacket dp = new DatagramPacket(b, b.length,InetAddress.getByName("192.168.1.255"),10001);
d.send(dp);
}
}catch(Exception e){
thrownew RuntimeException("发送失败");
}finally{
d.close();
}
}
}
//接收端socket
class receive implements Runnable
{
private DatagramSocket d;
public receive(DatagramSocket d)
{
this.d = d;
}
@Override
publicvoid run() {
try
{
while(true)
{
byte[] b = newbyte[1024];
DatagramPacket dp = new DatagramPacket(b, b.length);
d.receive(dp);
String str = dp.getAddress().getHostAddress();
String data = new String(dp.getData(),0,dp.getLength());
System.out.println(str+"=="+data);
}
}catch(Exception e){
thrownew RuntimeException("发送失败");
}finally{
d.close();
}
}
}
publicclass FakeQQ {
publicstaticvoid main(String[] args) {
try {
DatagramSocket send = new DatagramSocket();
DatagramSocket receive = new DatagramSocket(10001);
new Thread(new send(send)).start();
new Thread(new receive(receive)).start();
} catch (SocketException e) {
e.printStackTrace();
}
}
}
TCP:客户端服务端
|
Socket() 通过connect主动连接 |
|
Socket(InetAddress address, int port) |
TCP传输的特点
分客户端和服务端
客户端对应的对象是socket,服务端对应的对象是serverSocket
通过查阅socket对象,发现该对象在建立时,可以去连接指定主机
因为TCP面向连接,所以在建立socket连接时,形成通路时,在通道进行传输
步骤
1. 创建socket服务,指定主机和端口
2. 通路一建立,就会产生一个socket流(既有输入流又有输出流)
创建服务端
建立服务端的socket服务,serverSocket并监听一个端口
1. 获取连接过来的客户端对象
a) 通过accept方法完成获取客户端对象(阻塞式方法)
2. 客户端如果发过来数据,服务端要使用客户端对象,并获取到该客户端对象的读取流来读取发过来的数据,并操作数据
3. 关闭
publicclass TCPTest01 {
publicstaticvoid main(String[] args) throws IOException {
Socket s = new Socket("192.168.1.255",10033);
OutputStream out = s.getOutputStream();
out.write("额三大".getBytes());
}
}
class TCPServer{
publicstaticvoid main(String[] args) throws IOException {
//建立服务,监听端口
ServerSocket s = new ServerSocket(10033);
//通过accept方法获取对象
Socket ss = s.accept();
//获取客户端发送的数据,使用客户端对象来读取数据
InputStream in = ss.getInputStream();
byte[] b = newbyte[1024];
int i = in.read(b);
System.out.println(new String(b,0,i));
System.out.println(ss.getInetAddress().getLocalHost());
s.close();//服务端可以不关客户端必须关
}
}
浏览器访问服务端
ServerSocket ss = new ServerSocket(11232);
Socket s = ss.accept();
System.out.println(s.getInetAddress().getHostAddress());
PrintWriter p = new PrintWriter(s.getOutputStream(),true);
p.println("<p>aaa<p>");
s.close();
ss.close();
urlconnection
publicstaticvoid main(String[] args) throws IOException {
URL u = new URL("http://localhost:8080/myweb.html");
System.out.println(u.openConnection());
InputStream in = u.openConnection().getInputStream();
byte[] b = newbyte[1024];
int a ;
while((a = in.read(b))!= -1)
{
System.out.println(new String(b,0,a));
}
in.close();
相关推荐
黑马程序员_毕向东_Java基础视频教程第18天-14-IO流(拷贝文本文件图例).zip
黑马程序员_Java基础辅导班教程课件[第01期]第15天
黑马程序员_Java基础辅导班教程课件[第01期]第12天
黑马程序员_Java基础辅导班教程课件[第01期]第8天
黑马程序员_Java基础辅导班教程课件[第01期]第12天
黑马程序员_Java基础辅导班教程课件[第01期]第11天
黑马程序员_Java基础辅导班教程课件[第01期]第5天
黑马程序员_Java基础辅导班教程课件[第01期]第7天
黑马程序员_hibernate框架开发2016版讲义和笔记资料_day02
( 01_黑马程序员_张孝祥_Java基础加强_课程价值与目标介绍.zip )
黑马程序员_Java基础辅导班教程课件[第01期]第4天
黑马程序员_Java基础辅导班教程课件[第01期]第12天
黑马程序员_Java基础辅导班教程课件[第01期]第6天
黑马程序员_Java基础辅导班教程课件[第01期]第10天
黑马程序员_Java基础辅导班教程课件[第01期]第9天
黑马程序员_张孝祥_Java多线程与并发库,老师讲的非常仔细,老师很有耐心.欢迎大家下载学习.
黑马程序员_毕向东_Java基础视频教程第22天-06-GUI(Action事件).zip
黑马程序员_张孝祥_Java多线程与并发库,视频+代码+资料
黑马程序员_毕向东_Java基础视频教程第18天-09-IO流(文件的续写)
黑马程序员_hibernate框架开发2016版讲义和笔记资料_day1_day2_day3_day4 包含4天的教学文档