网络编程:
网络通讯三要素:IP地址、端口号、传输协议
TCP/IP:定义通信规则,这个通讯规则称为协议,国际组织定义了通信协议TCP/IP
IP:简单的说就是在TCP/IP协议中对每台计算机指定的标识号 用4个字节表示也就是32位的二进制格式192.168.8.1
端口:简单的说就是利用那个IP传送数据时给数据包头问了弄了一个称为端口的东东主要是来标识数据的交给那个应用 程序来使用 --这些个用来标识的数据就叫做端口
它是如果 我一个整数 端口数范围为0-65535之间 如果 我们一个网络程序指定自己所用端口号为3150那么,其实程序发给这个程序的数据包必须接收端口号为3150
UDP和TCP
TransmissionControlProtocol简称TCP传输控制协议 是面向连接通信协议TCP提供两台计算机之间的可靠无差错的数据传输,可以利用TCP在源和目标之间会建立 一个虚拟连接,这个连接一建立 那么两台计算机之间就可以把数据当作一个双向字节流进行交换。 好比打电话两个人之间都可以听到对方说话
这样只可以说他 大量数据 可靠 速度相比下面的UDP要慢一点
UserDatagramProtocol简称UDP用户数据报协议 是无连接通信协议,UDP不保证可靠数据的传输,但可以向多个目标发送数据,接收若干个源的数据,
也就这样说吧,一台主机向另一台主机发送数据这数据会立即发送不管对方是否准备接收,如果 另一台主机收到了数据实验室不会确认收到了没
也就这样说吧 就好以前的一些快递只负责发货不管对方是否收到了货
这样只可以说他:不可靠 但速度快 方便不用建立连接 限制数据包在64K以内
TCP、UDP数据包(数据帧)的基本格式
协议类型为TCP/UDP
Scoket:
简单的说这是一种网络服务机制 (就好比码头我们上货需要一个码头 下货也需要一个码头这个是两个货物的通信吧)所以的来说网络通信也就是这样的一个道理这是两个码头的通信那么我们也就可以说那个是两个Scoket间的通信 网络通信就是Scoket间的通信 数据在这中间是通过IO传输的
也分别为UDP和TCP两个通信协议提供了相应的编程类。
网络通信确切的说不 是两台计算机之间在收发数据而是两个网络程序之间在收发数据,我们也可以在一台计算机上进行两个网络程序间的通信只要端口号不同
UDP网络程序与UDP传输:
DatagramSocket和DatagramPacket:
首先DatagramSocket类的构造函数主要有三种形式:
public DatagramSocket()throws SocketException
public DatagramSocket(int port) throws SocketException
public DataGramSopcket(int port,InetAddress Iaddr)throws SocketException
如果程序不使用某个Socket我们就应该调用 DatagramSocket.close()方法关闭这个Sockeet
发送数据是无们用Datagram.send()方法其格式:
public void send(DatagramPacket p)throws IOException
要接收数据时用Datagram.receive(...)方法
public void receive(DatagramPacket p)throws IOException
这两个方法 都 需要我们传递一个DatagramPacket类的实例对象
DatagramPacket类的构造函数有以下格式
public DatagramPacket(byte[]buf,int length)//只定义了数据包的内存空间和大小
public DatagramPacket(byte[] buf,int length,InetAddress address,int port) //第二个则在第一个的基础上还指定了数据包的目标地址和端口
InetAddress
在发送数据时DatagramPacket构造方法 需要我们传递一个IneAddress类的实例对象,是用于表示 计算 机地址的一个类
下面我们来做一个的UDP
在一台计算机上相互发送和接收数据接收程序所用端口号为3000发送的不管IP地址是192.168.0.213
发送程序
import java.net.*;
public class Udpsend
{
public static void main(String[] args)throws Exception
{
DatagramSocket ds=new DatagramSocket();
String str="hello";
DatagramPacket dp=new DatagramPacket(sty.getBytes(),str.getBytes().length(),InetAddress.getByName("192.168.0.213"),3000);//因为中英文占字节个数不同的原因所以后面要这样写
ds.send(dp);
ds.close();
}
}
下来是接收程序
import java.net.*;
public class UdpRecv
{
public static void main(String[] args)throws Exception
{
DatagramSocket ds=new DatagramSocket(3000);
byte[] buf=new DatagramPacket(buf,1024);
ds.receive(dp);
String strRecv=new String(dp.getData(),0,dp.getLength())+"from"+dp.getAddress().getHostAddress()+":"+dp.getport();
System.out.println(strRecv);
ds.close;
}
}
为什么 接收程序代码没有放在一个新的线程中,而是直接在main方法中调用
public static void main(String [] args)
{
Chat chat=new Chat();
chat.init();
chat.run();
}
public void run()
{
byte buf[]=new DatagramPacket(buf,1024);
while(true)
{
try
{
ds.receive(dp);
lst.add(new String(buf,0,dp.getLength())+": from"+dp.getAddress().getHostAddress(),0);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}//因为系统创建了一个AWT线程,发送数据程序的代码正好 在这个AWT线程上运行而接收的程序代码就直接在main方法运行的线程上运行了,可见发送和接收部分是在两个不同的线程上运行的
TCP协议与TCP传输
UDP的两个协议是平等 的没有主次之分两个程序代码可以完全一样但是TCP就有了主次之分一个称为服务器程序,另一个称为客服程序两者功能与编写方法都不一样
java中提供 的SeverSocket类用于完成 一个类似于114查号 台总机的功能。
Socket类用于完成 普通电话 和114查号台座机连接 功能
1.服务器程序创建一个SeverSocket,然后调用accept方法 等待客户来连接
2.客户端程序创建一个Socket并请求与服务器建立 连接
3.服务器接收客户的连接请求,并创建一个新的Socket与该客户建立专线连接
4.刚建立了连接 的两个Socket在一个单独的线程(服务器去创建)上对话
5.服务器等待新的连接
ServerSocket
ServerSocket类的构造函数有如下几种 形式:
public ServerSocket()throws IOException//没有与任何端口号绑定不能直接使用需要调用bind方法才能完成 功能
public ServerSocket(int port)throws IOException//这里指绑定到一个指定 的端口上,就好比呼叫中心安排一个电话样
public ServerSocket(int port,int backlog)throws IOException//在第二个的基础上根据backlog参数指定在服务器忙忙时保持连接请求的等待客户数量,
public ServerSocket(int port,int backlog,InetAddress bingdAddr)throws IOException//建立 在第三个之上,还可以指定IP地址
Socket
Socket的构造函数“
public Socket() //创建Socket对象但不是与任何服务器建立连接,不能直接使用
public Socket(String host,int port) throws UnknownHostException,IOException//创建了对象后根据参数选择去连接 特定地址和端口上运行的服务器程序 接收字符串格式地址
public Socket(InetAddress address,int port)throws IOException//接收InetAddress对象所包装的地址其他的与第二个相同
public Socket(String host,int port,InetAddress locaAddr,int localPort) throws IOException//第四个和第五个是在第二个和第三个的基础上指定了Socket所绑定的IP地址和端口号
publicSocket(InetAddress address,int port,InetAddress localAddr,int localPort)throws IOException
一个TCP服务器程序
import java.net.*;
import java.io.*;
public class TcpSever
{
public static void main(String[]args)
{
try
{
ServerSocket ss=new ServerSocket(8001);
Socket s=ss.accept();
InputStream ips=s.getInputStream();
OutputStream ops=s.getOutputStream();
ops.write("welcome to www.it315.orgs!".getBytes());
byte[] buf=new byte[1024];
int len=ips.read(buf);
System.out.println(new String(buf,0,len));
ips.close();
ops.close();
s.close();
ss.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
正则表达式:符合一定规则的表达式
作用:用于专门操作字符串
特点:用于一些特定的符号来表示一些代码操作,这样就简化书写
好处:可以简化对字符串的复杂操作
弊端:符号定义越多,正则越长,阅读性越差。
具体操作功能
1 匹配:booleanmatches(regex);用规则蒲培整个字符串,只要有一处不符合规则,就匹配结束。
public static void checkQQ2()
{
String qq ="21312321123";
String regex ="[1-9][0-9]{4,14}"; 5-15位的
5-15位的第一个数1-9 剩余13个数0-9之间
boolean flag =qq.matches(regex);
if(flag)
System.out.println(qq+"....isok");
else
System.out.println(qq+".....isfailed");
}
2 切割:String split(); 得到符合规则以外的字符
splitDemo("erkktykkuiiiiiiqqafzzzzzeo","(.)\\1+");
叠词切割后一个和前一个一样的
为了将规则封装成一个组,用()完成,组的出现都有编号 从1开始,想要使用已有的组可以通过 \n(n就是组的编号)的形式出现
public static void splitDemo(String str,String reg)
{
// String str = "zhangsan.lisi.wangwu";
// String reg = " +";//按照多个空格来进行切割
// String reg = "\\.";正则中 "\." 表示按"."切割 在正则中"."表示任意字符
String[] arr = str.split(reg);
for(String s : arr)
{
System.out.println(s);
}
3 替换:String replaceAll(); 返回替换后的字符串
String str ="asdasd322334adasd1233223fasd";//将字符串中的数字替换成#号
replaceAllDemo(str,"\\d{5,}","#"); 数字连续超过5个以上的替换
String str1 ="erkktykkuiiiiiiqqafzzzzzeo";
replaceAllDemo(str1,"(.)\\1+","$1");//将多个相同字符替换成1个该字符
public static voidreplaceAllDemo(String str,String reg,String newStr)
{
str = str.replaceAll(reg,newStr);
System.out.println(str);
}
4 获取: 将字符串中的符合规则的字符串取出
操作步骤
1 将正则表达式封装成对象
2 让正则对象和要操作的字符串相关联
3 关联后,获取正则匹配引擎
4 通过引擎对符合规则的子串进行操作,比如取出
如果只想知道字符串是否对错,使用匹配
想要将已有的字符串变成另外一个字符串,替换
想要按照自定的方式将字符串变成多个字符串,切割。获取规则以外的子串
想要拿到符合需求的字符串子串,获取。获取符合规则的子串