1.本地回路的IP地址:127.0.0.1 测试本机网络程序
port 端口号,范围0~65535
2.UDP与TCP
TCP:传输控制协议,面向连接的通信协议
UDP:用户报协议,是无连接的通信协议
3.Scoket
网络驱动层提供给应用程序编程的接口和一种机制
Socket在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自己所对应的IP和Port
4.Socket数据发送过程
5.Java中的网络编程
位于java.net包中
DatagramSocket类用于UDP通信
ServerSocket类用于TCP通信的服务器端
Socket类用于TCP通信的服务器和客户端
UDP网络程序
①DatagramSocket类(创建发送的港口)
构造函数
publicDatagramSocket()//没有指定端口号
publicDatagramSocket(int port)
publicDatagramSocket(int port,InetAddress laddr)
close()方法
send(DatagramPacket P)方法
receive(DatagramPacket P)方法
②DatagramPacket类(待发送的集装箱)
public DatagramPacket(byte[]buf,int length)
public DatagramPacket(byte[]buf,int length,LnetAddresss address,int port)
getlnetAddress和getPort方法
getData和getLength方法
③LnetAddress类用于表示计算机IP地址的一个类
getName方法
getHostAddress方法
字符串与字节数组之间的双向转换
(start命令打开新命令窗口好处,完全继承原窗口环境;
解决中文字符显示:中文字符转换成字节会占用2个字节)
编程实例:
发送程序:UdpSend.java
import java.net.*;
public class UdpSend
{
public static void main(String [] args) throws Exception
{
DatagramSocket ds=new DatagramSocket();
String str="hello world";
DatagramPacket dp=new DatagramPacket(str.getBytes(),str.length(),InetAddress.getByName("192.168.0.3"),3000);//public DatagramPacket(byte[]buf,int length,LnetAddresss address,int port);str.length中加getBytes,成str.getBytes.length()解决中文字符不显示问题
ds.send(dp);
ds.close();
}
}
接收程序:UdpRecv.java//先启动接收者,在启动发送者
import java.net.*;
public class UdpRecv
{
public static void main(String [] args) throws Exception
{
DatagramSocket ds=new DatagramSocket(3000);//接受程序,端口号事先设定,DatagramSocket会发生异常
byte [] buf=new byte[1024];//
DatagramPacket dp=new DatagramPacket(buf,1024);//接收数据
ds.receive(dp);//接受数据到DatagramPacket中
String strRecv=new String(dp.getData(),0,dp.getLength()) +
" from " + dp.getAddress().getHostAddress()+":"+dp.getPort();//第0个字节开始,一直取到getLength()个长度; getAddress()获得IP地址信息;getHostAddress方法转换IP为192.168格式
System.out.println(strRecv);
ds.close();
}
}
TCP网络程序
1.工作原理
TCP客户端程序与TCP服务端程序的交互过程:
①服务器程序创建
2.ServerSocket类
构造函数:
public ServerSocket(int port,int backlog,lnetAddress bindAddr)
close方法
accept方法
3.Socket
构造函数:public Socket(lnetAddress address,int port,lnetAddress localAddress,int localPort)
getInputStream和getOutStream方法
编程实例:简单的TCP程序:
import java.net.*;
import java.io.*;
public class TcpServer
{
public static void main(String [] args)
{
try
{
ServerSocket ss=new ServerSocket(8001);//监听
Socket s=ss.accept();//没有客户端连接一直阻塞
InputStream ips=s.getInputStream();
OutputStream ops=s.getOutputStream();//getOutputStream返回输出流对象
ops.write("welcome to ());
/*byte [] buf = new byte[1024];
int len = ips.read(buf);
System.out.println(new String(buf,0,len));将字节数组buf转换成字符串*/
/*以上代码,只能读一个字符*/
BufferredReader br = BufferredReader(new InputStreamReader(ips));
System.out.println(br.readLine());
br.close()
ips.close();
ops.close();
s.close();
ss.close();
}catch(Exception e){e.printStackTrace();}
}
}
完善的TCP服务器程序模型
TCP服务器程序模型的编程要点:
- TCP服务器程序要想能接收多个客户端连接,需要循环调用ServerSockert.accept
- 服务器程序与每个客户端连接的会话程序不能互相影响,需要在独立的线程中运行
- 一个线程服务对象与一个服务器端Socket对象相关联,共同来完成与一个客户端的会话
如何检测和解决端口冲突
端口被占用,检测端口方法:netstat查看正在使用的TCP端口。
通过一个配置参数来指定TCP服务程序所使用的端口号。
import java.net.*;
import java.io.*;
public class TcpClient
{
public static void main(String [] args)
{ServerSocket ss=null;
/*if(args.length <1)
ss = new ServerSocket(8001);
else
ss= new ServerSocket(Interger.parse(args[0]));*/插入代码
在TCP网络连接上传递对象:
学生类:
import java.io.serializable
public class Student implements Serializable{
int id;
String name;
int age;
string department;
public student(int id,String name,int age)
{
this.id = id;
this.name =name;
this.age = age;
this.department = department;
}
}
服务器端:
import java.io.*
public class ObjectServer{
public static void mian()throws EXception
{
ServerSocket ss = new ServerSocket(8001);
Socket s = ss.accept();
OutputStream oos = new ObjectOutputStream(ops);
student stu = new Student(19,"wangwu",22,"huaxue")
oos.writeObject(stu);
oos.close();
s.close();
ss.close();
}
}
客户端
import java.net.*;
import java.io.*;
public class ObjectClient{
public static void mian(){
Socket s = new Socket("127.0.0.1",8001);
InputStream ips = s.getInputStream(ips);
ObjectInputStream ois = new ObjectInputStream(ips);
student stu = (student)ois.readObject();
System.out.println("id is"+stu.id);
System.out.println("name is"+stu.name)
System.out.println("age is"+stu.age);
System.out.println("department is"+stu.department);
}
}
访问Internet网络资源:
URL(uniform Resource Locator)
URL的基本组成:协议、主机名、端口号、资源名
URL编码规则:
将空格转换成加号(+),也可直接使用其十六进制表示,前加%,即%2B;其它字符都可用十六进制表示,每字节前加%。
HTTP协议的会话过程
了解几个HTTP消息头
Connection用于指定处理完
Accpt-Languag
Conect-Length
Range用于指定服务器只需返回文档中的部分内容及内容范围,格式:
Range:byte100-599返回100-599个字节内容、/-100最后100个
Content-Range用于指定服务器返回的部分实体内容的位置信息
URL类
构造方法(可能引发MslformedURLException异常)
public URL(String spec)
public URL(String protocol)
public URL(目录资源,)
指向网络资源的getPortotcol、getHost、getPort、getFile等方法
openConnection方法返回URLConnection对象
工厂设计模式
URL类的setURLStreamHandlerFactory(URLStreamhandlerFactory fac)静态方法
StreamHandler类的createURLStreamHandler(String portocol//ftp、http...)方法
不希望将如何创建出xy则可用工厂模式
URLConnection与Http
URLconnection类
URLConnection与HttpURLConnect,编程实例:
import java.net.*;
import java.io.*;
imprt java.util.*;
public class getgoogle{
public static void mian(String args[]){
}
public static void getContentBylanguage(String conntry)
{
URL urlgoogle = new URL("www.google,com";)
HttpURLConnection googleConnection = (HttpURLConnection)urlGoogle.openConnection
}