------- android培训、java培训、期待与您交流! ----------
网络编程
概述:
1,网络模型
OSI参考模型
TCP/IP参考模型
2,网络通讯要素:
IP地址
网络中设备的标识
不易记忆,可用主机名
本地回环地址:127.0.0.1 主机名localhost
端口号
用于标识进程的逻辑地址,不同进程的标识。
有效端口:0-65535,其中0-1024系统使用或保留端口。
传输协议
通讯的规则
常见协议:TCP,UDP
TCP与UDP
UDP
1,将数据及源和目的封装成数据包,不需要建立连接。
2,每个数据包的大小限制在64k内。
3,因为是无连接,所以是不可靠协议。
4,不需要建立连接,速度快。
TCP
1,建立连接,形成传输数据的通道。
2,在连接中进行大数据传输。
3,通过三次握手完成连接,是可靠协议。
4,必须建立连接,效率会稍低。
Socket
1,Socket就是为网络服务提供的一种机制。
2,通讯的两端都有Socket。
3,网络通讯其实就是Socket间的通讯。
4,数据在两个Socket间通过IO传输。
UDP传输
1,DatagramSocket与DatagramPacket
2,建立发送端,接收端
3,建立数据包
4,调用Socket的发送接收方法
5,关闭Socket
发送端与接收端是两个独立的运行程序。
利用USP协议,定义发送端
/*
需求:通过UDP传输方式,将一段文字数据发送出去,即定义发送端。
思路:
1,建立UdpSocket服务
2,提供数据,并将数据封装到数据包中
3,通过socket服务的发送功能,将数据包发送出去
4,关闭资源。
*/
import java.net.*;
class UdpSend
{
public static void main(String[] args)throws Exception
{
//创建udp服务,通过DatagramSocket对象。
DatagramSocket ds =new DatagramSocket();
//确定数据,并封装成数据包,通过DatagramSocket(byte[] buf,int length,InetAddress address,int port)
byte[] buf="hellohellohellohellohello".getBytes();
DatagramPacket dp=
new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.0.104"),10000);
//通过socket服务,将已有数据包发送出去,通过send方法
ds.send(dp);
//关闭资源
ds.close();
}
}
利用UDP协议,定义接收端
/*
定义一个应用程序,用于接收udp协议传输的数据并处理
思路:
1,定义udp socket服务
2,定义数据包,因为要储存接收到的数据,而数据包对象中有更多功能可以提取字节数据中不同的数据信息。
3,通过socket服务的receive方法将收到的数据存入已定义好的数据包中
4,通过数据包对象的特有功能,将这些不同的数据取出。
5,关闭资源。
*/
class UdpRece
{
public static void main(String[] args)throws Exception
{
//创建udp socket,建立端点
DatagramSocket ds = new DatagramSocket(10000);
while(true)
{
//定义数据包,用于储存数据
byte[] buf = new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
//通过receive方法将收到的数据存入数据包中
ds.receive(dp);//该方法为阻塞式方法
//通过数据包的方法获取其中的数据
String ip=dp.getAddress().getHostAddress();
String data=new String(dp.getData(),0,dp.getLength());
int port =dp.getPort();//获取端口
System.out.println(ip+"--"+data+"--"+port);
//关闭资源
//ds.close();
}
}
}
用udp协议实现聊天功能练习
/*
利用udp编写聊天程序,有收数据的部分和发数据的部分。
这两个部分需要同时执行,那就需要使用多线程。
一个线程控制接收,一个线程控制发送。
*/
import java.net.*;
import java.io.*;
class ChatSend implements Runnable
{
private DatagramSocket ds;
public ChatSend(DatagramSocket ds)//构造函数
{
this.ds=ds;
}
public void run()
{
try
{
BufferedReader bur =
new BufferedReader(new InputStreamReader(System.in));
String line=null;
while((line=bur.readLine())!=null)//循环读取键盘录入的数据
{
if("baibai".equals(line))
break;
byte[] by=line.getBytes();
//将数据封装成数据包并发送到指定地址
DatagramPacket dp=
new DatagramPacket(by,by.length,InetAddress.getByName("192.168.0.104"),10002);
}
}
catch(Exception e)
{
throw new RuntimeException("发送失败");
}
}
}
class ChatRece implements Runnable
{
private DatagramSocket ds;
public ChatRece(DatagramSocket ds)
{
this.ds=ds;
}
public void run()
{
try
{
while(true)
{
byte[] by=new byte[1024];
DatagramPacket dp=
new DatagramPacket(by,by.length);
ds.receive(dp);//将接收到的数据存储到定义好的数据包中
String ip=dp.getAddress().getHostAddress();//获取ip地址
String data=new String(dp.getData(),0,dp.getLength());//获取具体数据
System.out.println(ip+"::"+data);
}
}
catch(Exception e)
{
throw new RuntimeException("接收失败");
}
}
}
class MyChatTest
{
public static void main(String[] args)throws Exception
{
DatagramSocket SendSocket =new DatagramSocket();
DatagramSocket ReceSocket =new DatagramSocket(10002);
new Thread(new ChatSend(SendSocket)).start();
new Thread(new ChatRece(ReceSocket)).start();
}
}
TCP传输
1,Socket和ServerSocket
2,建立客户端和服务器端
3,建立连接后,通过Socket中的IO流进行数据的传输
4,关闭Socket
同样,客户端与服务器端是两个独立的应用程序。
客户端对应的对象是Socket,服务端对应的对象是ServerSocket。
利用TCP协议,定义客户端及服务端
<pre name="code" class="java">/*
需求:给服务端发送文本数据。
客户端:通过查阅Socket对象,发现在该对象建立时,就可以去连接指定主机
tcp是面向连接的,所以在建立Socket服务时,就要有服务端存在,并连接成功,形成通路后
在该通路进行数据的传输。
*/
import java.io.*;
import java.net.*;
class TcpClient
{
public static void main(String[] args)throws Exception
{
//创建客户端的Socket服务,指定目的主机和端口
Socket s =new Socket("192.168.0.104",10001);
//为了发送数据,应该获取Socket流中的输出流
OutputStream out=s.getOutputStream();
out.write("anything".getBytes());
s.close();
}
}
/*
需求:定义端点接收数据并打印在控制台上。
服务端:
1,建立服务端的Socket服务,ServerSocket();
2,获取链接过来的客户端对象,通过accept方法
3,使用对应客户端对象,并获取到该客户端对象的读取流来读取发过来的数据
4,关闭服务端(可选)
*/
class TcpServer
{
public static void main(String[] args)
{
//建立服务端的Socket服务,并监听一个端口
ServerSocket ss=new ServerSocket(10001);
//通过accept方法获取连接过来的客户端对象
Socket s = ss.accept();//该方法为阻塞式方法
//获取客户端ip地址
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+"connected");
//获取客户端发送过来的数据,使用客户端对象的读取流来读取数据
InputStream in =s.getInputStream();
byte[] buf=new byte[1024];
int len = in.read(buf);
System.out.println(new String(buf,0,len));
s.close();//关闭客户端
ss.close();
}
}