Java基础——网络编程(二)
一、套接字 Socket
网络驱动程序提供给应用程序编程的接口和一种机制,可以比喻成一个港口码头 应用程序只要把货放在这,就算完成了货物的运送。它在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自已对应的IP 和 Port。
Socket是 java 中网络编程的类 , 位于java.net包中。
---- DatagramSocket //用于UDP通迅
---- ServerSocket //用于TCP通讯,用于服务端
---- Socket //用于Tcp通讯的服务端和客户端
二、UDP 网络程序
InetAddress 类 表示互联协议(IP)地址
//static InetAddress getLocalHost() throws UnknownHostException 返回本地主机
//static InetAddress getByName(String host) 在给定主机名的情况下确定主机的 IP 地址。 主机名可以是机器名
//(如 "java.sun.com"),也可以是其 IP 地址的文本表示形式
//static InetAddress[] getAllByName(String host) 根据主机名返回其 IP 地址所组成的数组。
static void ipDemo() throws UnknownHostException{
InetAddress netAddr=InetAddress.getLocalHost(); //取得本地电脑的一些信息
System.out.println(netAddr.toString());
System.out.println(netAddr.getHostAddress());
System.out.println(netAddr.getHostName()); //取得其他电脑的信息
InetAddress netAddr2=InetAddress.getByName("DELL-PC"); //这里也可以传IP地址
System.out.println(netAddr2.getHostAddress()); //169.254.170.71
System.out.println(netAddr2.getHostName()); //DELL-PC //取得百度的地址
InetAddress [] ipList=InetAddress.getAllByName("www.baidu.com");
for(InetAddress addr:ipList){
System.out.println(addr.toString());
}
}
三、UDP发送和接收 DatagramSocket , DatagramPacket
//例一 最简的发送和接收
发送端==要导java.net包
通过UDP的方式把数据发出去:
1) 建立UDPSocket服务
2) 提供数据,将数据封装到数据包中 DatagramPacket (byte[] buf, int length, InetAddress address, int port) //构造函数有多个
3) 通过Socket服务,发送数据
4) 关闭资源
import java.net.*;
class Sender4{
//DatagramPacket (byte[] buf, int length, InetAddress address, int port)
public static void main(String [] args) throws Exception
{
byte [] buff="hello cat".getBytes();
DatagramSocket socket=new DatagramSocket();
DatagramPacket packet=new DatagramPacket(buff,buff.length,InetAddress.getByName("192.168.0.103"),8888);
socket.send(packet);
socket.close();
System.out.println("ok");
}
}
--接收端
1) 创建Socket服务,指定在某个端口上监听
2) 创建一个用于接收数据的 DatagramPacket
3) 从包中取出数据
4) 关闭资源
import java.net.*;
class Receive4
{
public static void main(String [] args) throws Exception
{
DatagramSocket socket=new DatagramSocket(8888); //别忘了端口号
byte[] buff=new byte[1024] ;
DatagramPacket packet=new DatagramPacket(buff,buff.length); socket.receive(packet); String senderIp=packet.getAddress().getHostAddress();
String senderData=new String(packet.getData(),0,packet.getLength());
int senderPort=packet.getPort();
System.out.println(senderIp+"---"+senderData+"---"+senderPort); socket.close();
}
}
//例二,循环的发送和接收
import java.net.*;
import java.io.*;
class NewSender{
public static void main(String [] args) throws Exception
{
System.out.println("发送端启动了");
DatagramSocket socket=new DatagramSocket(); BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); //包装键盘输入流
String str=null;
while((str=br.readLine())!=null){
byte [] buff=str.getBytes();
DatagramPacket packet=new DatagramPacket(buff,buff.length,InetAddress.getByName("127.0.0.1"),9000);
socket.send(packet);
} br.close();
socket.close();
}
}
import java.net.*;
class NewReceiver{
public static void main(String [] args) throws Exception
{
DatagramSocket socket=new DatagramSocket(9000);
System.out.println("接收端启动了"); while(true){
byte [] buff=new byte[1024] ;
DatagramPacket packet=new DatagramPacket(buff,buff.length);
socket.receive(packet); String senderIp=packet.getAddress().getHostAddress();
int sendPort=packet.getPort();
String msg= new String(packet.getData(),0,packet.getLength()); System.out.println(senderIp+":"+sendPort+":"+msg);
}
}
}
例三:多线程聊天室程序
class Chat
{
public static void main(String [] args)
{
new Thread(new SendThread()).start();
new Thread(new ReceiveThread()).start();
}
}
//发送端
import java.io.*;
import java.net.*;
class SendThread implements Runnable
{
private DatagramSocket socket;
public void run()
{
try{
socket=new DatagramSocket();
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String msg=null;
while((msg=br.readLine())!=null){
byte[] buff=msg.getBytes();
DatagramPacket packet=new DatagramPacket(buff,buff.length,InetAddress.getByName("127.0.0.1"),10000);
socket.send(packet);
} socket.close();
br.close();
}
catch(Exception ex){
ex.printStackTrace();
}
}
}
//接收端
import java.net.*;
class ReceiveThread implements Runnable{
private DatagramSocket socket; public void run(){
try{
socket=new DatagramSocket(10000);
while(true){
byte [] buff=new byte[1024];
DatagramPacket packet=new DatagramPacket(buff,buff.length);
socket.receive(packet); String senderIp=packet.getAddress().getHostAddress();
int senderPort=packet.getPort();
String msg=new String(packet.getData(),0,packet.getLength()); System.out.println(senderIp+":"+senderPort+":"+msg); }
}
catch(Exception ex)
{
System.out.println(ex.getMessage());
}
}
}
Java基础——网络编程(二)的更多相关文章
- java基础-网络编程(Socket)技术选型入门之NIO技术
java基础-网络编程(Socket)技术选型入门之NIO技术 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.传统的网络编程 1>.编写socket通信的MyServer ...
- 二十三、Java基础--------网络编程
Java中另一个重要技术就是网络编程了,为了更好的学习web方向的知识,有必要对java之网络编程好好学习,本文将围绕网络编程技术进行分析. 常见的网络协议:UDP.TCP UDP 1. 将数据源和目 ...
- Java基础——网络编程
一.网络编程概述 概述: Java是 Internet 上的语言,它从语言级上提供了对网络应用程序的支持,程序员能够很容易开发常见的网络应用程序. Java提供的网络类库,可以实现无痛的网络连接,联网 ...
- java基础—网络编程
一.网络基础概念 首先理清一个概念:网络编程 != 网站编程,网络编程现在一般称为TCP/IP编程.
- JAVA基础——网络编程之网络链接
一.网络编程基本概念 1.OSI与TCP/IP体系模型 2.IP和端口 解决了文章最开始提到的定位的问题. IP在互联网中能唯一标识一台计算机,是每一台计算机的唯一标识(身份证):网络编程是和远程计算 ...
- Java基础——网络编程(一)
本文主要记录网络编程的一些基础知识,学了前班部分,对专业术语有些蒙,但是,收货也是很多很多的.观察了自己计算机的进程,查找其他网络地址的IP,对互联网的层次关系有了更深一步的了解.下面多是概念的摘录, ...
- Java基础——网络编程(三)
TCP 网络编程 -- tcp 分为客户端和服务端 -- 客户端对应的对象是 Socket -- 服务端对应的对象是 ServerSocket -- 如果客户端先启动,则出现 connection r ...
- 梦入IBM之java基础-网络编程
如今我们来谈谈最后的内容:网络编程: 1):TCP中是线程与线程进行通讯!内部的执行机制是这种:先有一个线程去监听某个port.然后假设有Socket连接上来了以后,server会生成一个Socket ...
- Java基础-网络编程1
网络编程 Socket 基本概念 C/S结构 :全称为Client/Server结构,是指客户端和服务器结构.常见程序有QQ.迅雷等软件. B/S结构 :全称为Browser/Server结构,是指浏 ...
随机推荐
- html\css不同长度文本左右对齐 text-align:justify的使用
在平常的开发过程中,对于text-align一般用到的是left,center,right,这三个属性都不会陌生.然而,对于justify的使用我却是很陌生.首先有个比较简单的例子. 如下代码: &l ...
- C# 嵌入dll
在很多时候我们在生成C#exe文件时,如果在工程里调用了dll文件时,那么如果不加以处理的话在生成的exe文件运行时需要连同这个dll一起转移,相比于一个单独干净的exe,这种形式总归让人不爽,那么有 ...
- wpf 的依赖属性只能在loaded 事件之后才能取到
wpf 的依赖属性只能在loaded 事件之后才能取到,在构造函数的 InitializeComponent(); 之后取不到 wpf 的依赖属性只能在loaded 事件之后才能取到,在构造函数的 ...
- Spring Framework 4.3.22.RELEASE Reference文档目录
<Spring Framework Reference Documentation 4.3.22.RELEASE> https://docs.spring.io/spring/docs/4 ...
- python常用代码片段
目录 Python3常用 文件处理 json处理 log日志 argparse使用 INIparser Python3常用 文件处理 class BaseMethod: @staticmethod d ...
- 二进制转化为十进制Java实现
二进制转化为十进制 ①按权展开方法Java实现 /* * 按权展开法 */ public static double BinToTen1(String binary) { //查找该二进制是否存在小数 ...
- RabbitMQ在mac上的安装
1.官网下载rabbitmq-server-3.6.3, 地址http://www.rabbitmq.com/install-standalone-mac.html.2.tar -zxvf rabbi ...
- python音乐播放器第二版
此代码是上一期的改版 需要用到的Python库有 .pygame 2.time 3.xmusic(我自己写的用来做音乐索引) .colorama(美观) 推荐使用pip安装 方法: pip ins ...
- Redis---事务和Wtach
1. 概述 Redis通过 MULTI, EXEC / WATCH 等命令来实现事务. 事务提供一种将多个命令请求打包, 然后一次性.按顺序的执行多个命令的机制. 并且在事务执行期间, 服务器不会中断 ...
- ES6中的元编程-Proxy & Reflect
前言 ES6已经出来好久了,但是工作中比较常用的只有let const声明,通过箭头函数改this指向,使用promise + async 解决异步编程,还有些数据类型方法...所以单独写一篇文章学习 ...