网络编程的基础知识
网络协议与TCP/IP
IP地址和Port(端口号)
本地回路的IP地址:127.0.0.1
ping 127.0.0.1检查协议是否被正确安装
没有和网卡绑定
Port 把数据包交给那个网络应用程序处理
端口号的范围0~65535之间,0~1023之间的端口数是用于一些知名网络服务和应用。
UDP与TCP
TCP,传输控制协议,是面向连接的通信协议
UDP,是用户数据报协议,是无连接通信协议
Socket
Socket 是网络驱动层提供给应用程序编程的接口和一种机制。
Socket 在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自己对所有对应的IP和Port。
Java中的网络编程类
位于java.net包中
DatagramSocket类用于UDP通信。
ServerSocket类用于TCP通信的服务器端。
Socket类用于TCP通信的服务器和客户端
UDP网络程序
DatagramSocket类
DatagramPacket类
InetAddress类
最简单的UDP程序
用UDP编写网络聊天程序
DatagramSocket类
创建收发数据包的类
构造函数
public DatagramSocket()//主动发送
public DatagramSocket(int port)//先接收
public DatagramSocket(int port,InetAddress laddr)//在有多个ip地址的计算机上运行
close方法//关闭对象 释放资源
send(DatagramPacket p)方法 //用于发送数据包
receive(DatagramPacket p)方法 用于接收数据包
DatagramPacket类
如果把DatagramSocket比作创建的港口码头,那么DatagramPacke就是发送和接收数据的集装箱。
构造函数
public DatagramPacket(byte[]buf,int lengh)//指定了数据包缓冲区和其大小,接收数据用
public DatagramPacket(byte[]buf,int lengh,InetAddress address,int port)//不仅指定了数据包缓冲区和其大小还指定了接收计算机地址和端口,发送数据用
getlnetAddress和getPort方法
可以知道发送方的地址和端口号
getData和getLengt//返回长度 方法
InetAddress类
InetAddress是用于表示计算机IP地址的一个类,而在日常应用中的计算机地址是用“192.168.0.1”等字符串格式来表示的
getByName方法
getHostAddress 方法 //返回包装的用点分隔的ip地址
最简单的UDP程序
字符串与字节数组之间的双向转换。
UDP接收程序必须先启动运行,才能接收UDP发送程序发送的数据。
import java.net.*;
public class UdpSend{
public static void main(String[] args)throws Exception{
DatagramSocket ds= new DatagramSocket();
String strInfo="hello www.it315.org";
ds.send(new DatagramPacket("hello www.it315.org".getBytes(),"hello www.it315.org".length(),InetAddress.getByName("192.168.0.2"),3000);
ds.close();
}
}
import java.net.*;
public class UdpRecv{
public static void main(String[] args) throws Exception{
DatagramSocket ds=new DatagramSoket(3000);
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,1024);
ds.recieve(dp);
System.out.println( new String(dp.getData(),0,dp.getLength())+//返回字节数组
dp.getAddress().getHostAddress()//获得发送方的ip地址信息+":"+dp.getport()//获取端口号);
}
}
出现中文后 用getBytes.length 求出字节数组长度而不是字符串长度
用UDP编写网络聊天程序
分为三个步骤来完成:
1.编写图形用户界面;
2.编写网络消息发送功能
3.编写网络消息接收功能;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
class Chat extends Frame {
List lst=new List(6);//文本框
TextField tfIP=new TextField(15);//ip地址输入文本框 最多显示15
TextField tfData=new TextField(20);
DatagramSocket ds=null;
public Chat(){
try
{
ds=new DatagramSocket(3000);
}
catch(Exception e)
{
e.printStackTrace();
}
this.add(1st,"Center");
Panel p=new Panel();
this.add(p,"South");
P.setLayout(new BorderLayout());
p.add(tfIP,"West");
P.add(tfData,"East");
new Thread(new Runnable())
{
public void run()
{
byte buf[]=new byte[1024];
DatagramPacket dp= new DatagramPacket(buf,10254);
while(true)
{ try{
ds.receive(dp);
list.add(new String(buf,0,dp.getLengh())+"from"+dp.getAddress().getHostAddress()+":"dp.getPort(),0);
}
catch(Exception e)
{
if(!ds.isClose()
{
e.printStrackTrace();
}
}
}
}
}
tfData.addActionListener(new ActionListener())
{
public void actionPerformed(ActionEven e)
{
byte[] buf;
buf =tfData.getText().getBytes();
try
{
DataramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByNametfIP.getText(),3000);
ds.send(dp);
}
catch(Excepton ex)
{
ex.printStackTrace();
}
tfData.setText("");
}
}
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e)
ds.close;
dispose();//关闭文本框
System.exit(0);
}
});
}
public static void main(String args[]){ //文本框设置
System.out.println("Starting Chat...");
Chat mainFrame=new Chat();
mainFrame.setSize(300,400);
mainFrame.setTittle("Chat");
mainFrame.setVisible(true);
mainFrame.setResizable(false);
}
}
只有UDP才能发送和接收广播
私有IP通过网关代理上网的原理
I'm in bewilderment or confusion
TCP网络程序的工作原理
TCP客户端程序与TCP服务器端程序的交互过程:
(1)、服务器程序创建一个ServerSocket,然后调用accept方法等待客户来连接。
(2)、客户端程序创建一个Socket并请求与服务器建立连接。
(3)、服务器接受客户的连接请求,并创建一个新的Socket与该客户建立专线连接。
(4)、建立连接的两个Socket在一个单独的线程上对话。
(5)、服务器开始等待新的连接请求,当新的连接请求到达时,重复步骤(2)到(5)的过程。
ServerSocket类
构造函数:
public ServerSocket()//不能直接使用调用bend方法
public ServerSocket(int port)//指定了一个端口号
public ServerSocket(int port,int backlog)//指定了额端口号,backlog参数
public ServerSocket(int port,int backing,InetAddress binAddr)
close方法
将对象关闭
accept方法
Socket
构造函数:
public Socket()
public Socket(String host,int port)
public Socket(InetAddress address,int port)
public Socket(String host,int port,InetAddress localAddr,int localPort)
public Socket(InetAddress address,int port,InetAddress localAddr,int localPort)
getInputStream和getOutputStream方法
简单的TCP服务器程序
TCP服务器必须先启动运行,TCP客户程序才能连接上TCP服务器
使用Windows提供的telnet程序测试TCP服务器程序
使用BufferedReader包装类,从网络输入流中一次读取一行文本。
如何打开telnet程序的本地回显功能。
import java.net.*;
import java.io.*;
public class TcpServer{
public static void main(String[] args){
try{
if(args.length<1)
{
ss=new ServerSocket(8001);
}
else
{
ss=new ServerSocket(Integer.parseInt(args[9]))
}
Socket s=ss.accept();
InputStream ips=s.getInputStream();
OutputStream ops=s.getOutputStream();
ops.write("welcome to www.it315.org".getBytes());
byte buf=new byte[1024];
int len= ips.read(buf);
System.out.println(new String(buf,0,len));
BufferedReader br=new BufferedReader(new InputStreamReader(ips));
System.out.printlnbr.readLine();
/*
//ips.clsoe();
ops.close();
s.close();
ss.close(); */
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
如何检测和解决端口冲突问题
使用netstar命令查看当前正在被使用的TCP端口号。
通过一个配置参数来指定TCP服务程序所使用的端口号。
在TCP网络连接上传递对象
ObjectInputStream和ObjectOutputStream可以从底层输入流中读取对象类型的数据和将对象类型的数据写入到底层输出流。
使用ObjectInputStream和ObjectOutputStream来包装底层网络字节流,TCP服务器好TCP客户端之间就可以传递对象类型的数据。
编程实例:通过网络传输Java对象。
网络通信双方必须使用同一种通信协议。
怎样区分ASP、JSP与网络编程的概念。
访问Internet网络资源
URL
URL的基本组成:协议、主机名、端口号、资源名。
URL编码规则:
将空格转换为(+)。
对0-9,a-z,A-Z之间的字符保持不变
对于所用其他的字符,用这个字符集编码在内存中的十六进制格式表示,并在每个字节前加上一个百分号(%)。如字符“+”用%2B表示,字符“=”用%3D表示,字符“&”用%26表示,每个中文字符在内存中两个字节,字符“中”,用%D6%D0表示。
对于空格也可以直接使用其十六进制编码方式,即用%2O表示,而不是将它转换成(+)。
HTTP协议的会话过程
HTTP响应过程
一个完整的响应消息包括:一个状态行、若干消息头、以及实体内容。
URL类
构造函数
public URL(String spec)
public URL(String protocol,String host,int port,String File)
public URL(String protcol,String host,int port,String file,URLStreamHandler handler)
public URL(URL context,String spec)
工厂设计模式
URL类的setURLStreamHandlerFactory的静态方法
StreamHandlerFactory类的createURLStreamHandle(String protocol)方法。
URLConnection 与HttpURLConnection类
import java.net.*;
import java.io.*;
import java.util.*;
public classGetGoogle{
public static void main(Sting[] args){
public static void getContentByLangue(String country)
{
URL urlGoogle=new URL("http://www.google.com");
HttpURLConnection googleConnecting=
(HttpURLConnection)urlGoogle.openConnection();
googleConnection.setRequestMethod("Accept-Language",country);
googleConnection.connect();
googleConnection.getRequestProperties();
Map request=googleConnection.getRequestProperties();
Set reqFields=resquest.keySet();
Iterator itrReq=reqFields.iterator();
while(itrReq.hasNext())
{
String field=(String) trReq.next();
Systen.out.println(field+":"+
googleConnection.getRequestProperty(field));
}
Map responses=googleConnection.getHeadFields();
Set resFields=responses.keySet();
Iterator itrRes=resFields.iterator();
while(itrReq.hasNext())
{
String field=(String) trRes.next();
Systen.out.println(field+":"+
googleConnection.getHeaderField(field));
}
InputStream is=googleConnection.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader());
String strLine=null;
while(strLIne=br.readLine())!=null)
{
System.out.println(strLine);
}
br.close();
googleConnection.disconnect();
}
}
}