1.网络编程:
1)概念:
就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换。
2)信三要素:
IP地址:InetAddress 网络中设备的标识,不易记忆,可用主机名
端口号 用于标识进程的逻辑地址,不同进程的标识
传输协议通讯的规则 常见协议:TCP,UDP
3)TCP,UDP区别:
UDP
1)属于不可靠协议
2)不需要建立连接通道,所以执行效率高,但是安全性低!
3)发送内容的时候,有大写数据!
TCP/IP协议
1)属于可靠协议
2)需要建立连接通道,
服务器端监听客户端连接,如果客户端没有跟服务器端口进行绑定,
服务器一直等待,执行效率低,但是安全性高
3)发送内容的时候,数据大小没有限制!
3)UDP:
1.UDP协议方式发送端的代码实现思想:
1)创建UDP发送端的Socket对象
2)创建数据报包
3)发送
4)释放资源
socket对象.close()
2.UDP接收端的代码实现思想:
1)创建接收端的Socket对象
2)创建一个接收容器: 自定义一个缓冲区byte[] (创建数据包报)
3)接收
4)解析真实数据
5)展示ip和发送的内容
接收端的接收数据并且将数据展示出来! 模拟真实场景,不需要关闭
3.案例:
----------------------------------键盘录入--------------------------------------
* UDP协议方式发送端的代码实现
*
* 1)创建UDP发送端的Socket对象
* 2)创建数据报包
* 3)发送
* 4)释放资源
* socket对象.close()
*
*
*
* UDP发送端不断的键盘录入数据,接收端的接收数据并且将数据展示出来!
*
* Scanner sc = new Scanner(System.in) ;
* BufferedReader(new InputStreamReader(System.in)) ;
*
*
*/
public class SendDemo {
public static void main(String[] args) throws Exception {
//1)创建UDP发送端的Socket对象
//public DatagramSocket() throws SocketException
DatagramSocket ds = new DatagramSocket() ;
//创建一个BufferedReader流对象:键盘录入
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in)) ;
String line = null ;
while((line=br.readLine())!=null){
//自定义结束条件
if("886".equals(line)){
break ;
}
//2)创建数据报包---- >包含ip和端口+里面的数据
//DatagramPacket
//public DatagramPacket(byte[] buf ,int length,InetAddress address,int port)
DatagramPacket dp = new DatagramPacket(line.getBytes(),line.getBytes().length,
InetAddress.getByName("10.12.159.158"),10086) ;
//3)发送
//public void send(DatagramPacket p)
ds.send(dp) ;
}
//4)释放资源
ds.close() ;
}
}
* UDP接收端的代码实现
* 1)创建接收端的Socket对象
* 2)创建一个接收容器: 自定义一个缓冲区byte[] (创建数据包报)
* 3)接收
* 4)解析真实数据
* 5)展示ip和发送的内容
*
*接收端的接收数据并且将数据展示出来! 模拟真实场景,不需要关闭
*
*/
@SuppressWarnings("all")
public class ReceiveDemo {
public static void main(String[] args) throws IOException {
//1)创建接收端的Socket对象DatagramSocket
//public DatagramSocket(int port)
DatagramSocket ds = new DatagramSocket(10086) ;
while(true){
//创建一个接收容器: 自定义一个缓冲区byte[]
byte[] bytes = new byte[1024] ;
int length = bytes.length ;
//(创建数据包报)
//public DatagramPacket(byte[] buf,int length)
DatagramPacket dp = new DatagramPacket(bytes,length) ;
//3)接收
// public void receive(DatagramPacket p)
ds.receive(dp);
//4)解析接收容器中的真实内容
//public byte[] getData():获取缓冲区中的真实的字节数组
//public int getLength():获取缓冲区中的长度
//获取实际内容
String str = new String(dp.getData(),0,dp.getLength()) ;
//获取ip地址
//public InetAddress getAddress()
String ip = dp.getAddress().getHostAddress() ;
System.out.println("data from "+ip +",content is :"+str) ;
}
//释放资
ds.close() ;
}
}
----------------------------------线程--------------------------------------
public class SendThread implements Runnable {
private DatagramSocket ds ;
public SendThread(DatagramSocket ds) {
this.ds = ds ;
}
@Override
public void run() {
try {
//创建一个BufferedReader流对象:键盘录入
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in)) ;
String line = null ;
while((line=br.readLine())!=null){
//自定义结束条件
if("886".equals(line)) {
break;
}
DatagramPacket dp = new DatagramPacket(line.getBytes(),line.getBytes().length,
InetAddress.getByName("10.12.159.190"),8888) ;
//3)发送
//public void send(DatagramPacket p)
ds.send(dp) ;
}
} catch (IOException e) {
e.printStackTrace();
}
//4)释放资源
ds.close() ;
}
}
public class ReceiveThread implements Runnable {
private DatagramSocket ds ;
public ReceiveThread(DatagramSocket ds) {
this.ds = ds ;
}
@Override
public void run() {
try {
while(true){
//创建一个接收容器: 自定义一个缓冲区byte[]
byte[] bytes = new byte[1024] ;
int length = bytes.length ;
//(创建数据包报)
DatagramPacket dp = new DatagramPacket(bytes,length) ;
//3)接收
//public void receive(DatagramPacket p)
ds.receive(dp);
//获取实际内容
String str = new String(dp.getData(),0,dp.getLength()) ;
//获取ip地址
//public InetAddress getAddress()
String ip = dp.getAddress().getHostAddress() ;
System.out.println("data from "+ip +",content is :"+str) ;
}
} catch (IOException e) {
e.printStackTrace();
}
//释放资
//ds.close() ;
}
}
* 改进:UDP的发送端和接收端在一个窗口中进行聊天
* UDP的发送端不断键盘录入数据,接收端不断的接收数据并且站数据数据:一个窗口中聊天呢
*
* 多线程
* 使用多线程实现方式2来实现
* 分析
* 1)SendThread:发送端的线程资源类 实现 Runnable接口 ,实现run方法
* 2)ReveiveThread:接收端的线程资源类 实现Runnable接口 ,实现run方法汇总
* 3)创建资源类对象
* 4)创建Thread类对象,将上面的资源类对象作为参数传递
*
*/
public class ChatRoomDemo {
public static void main(String[] args) throws SocketException {
//主线程中
//分别此处创建发送端的Socket以及接收端的Socket
//发送端的Socket
DatagramSocket sendDs = new DatagramSocket() ;
//接收端的Socket
DatagramSocket receiveDs = new DatagramSocket(8888) ;
//创建发送端的资源类对象
SendThread st = new SendThread(sendDs) ;
//创建接收端的资源类对象
ReceiveThread rt = new ReceiveThread(receiveDs) ;
//创建线程
Thread t1 = new Thread(st) ;
Thread t2 = new Thread(rt) ;
t1.start() ;
t2.start() ;
}
}
|