java 2-5

 

网络编程的基础知识
网络协议与TCP/IT
端口号的范围为0-65535之间,0-1023之间的端口数是用于一些知名的网络服务和应用。
udp与Tcp
tcp(Transmission Control Protocol)传输控制协议是面向连接的通信协议
udp(User Datagram Protocol)用户数据报协议是无连接通信协议

TCP、UDP的数据帧格式简单图例
协议类型 源Ip 目标IP 源端口 目标端口 帧序号 帧数据
Socket是网络驱动层提供给应用层编程的接口和一种机制

位于java.net
DatagramSocket类用于UDP通信
ServerSocket类用于TCP通信的服务端
Socket类用于TCP通信的服务器和客服端


DaragramSocket类
public DatagramSocket()
public DatagramSocket(int port)
public DatagramSocket(int port,InetAddress Laddr)

close()方法
send(DatagramPacket p)方法
receive(DatagramPacket p)方法


//发送方
public class UdpSend {

 public static void main(String[] args)throws Exception {

  DatagramSocket ds = new DatagramSocket();
  String strInfo="中国www.it315.com";
  
  ds.send(new DatagramPacket("中国www.it315.com".getBytes(), "中国www.it315.com".getBytes()
    .length,InetAddress.getByName("192.168.1.8"),3000));
  ds.close();
 }

}
接收方:
public class UdpRecv {

 
 public static void main(String[] args) throws Exception {
  DatagramSocket ds=new DatagramSocket(3000);
  byte[] buf=new byte[1024];
  DatagramPacket dp=new DatagramPacket(buf, 1024);
  ds.receive(dp);
  System.out.println(new String(dp.getData(),0,dp.getLength())+"from"+dp.getAddress().getHostAddress()+":"+dp.getPort());
  ds.close();
 }

}

ServerSocket
构造函数:
public ServerSocket()
pulbic ServerSocket(int port)
public ServerSocket(int port,int backlog)
public ServerSocket(int port,int backlog,InetAddress bindAddr)
close方法

Socket
构造函数:
public Socket()
public Socket(String host,ing port)
pulibc Socket(InetAddress address,int port,InetAddress localAddr,int localPort)
public Socket(InetAddress address,int port,InetAddress localAddr,int localPort)

getInputStream和getOutputStream方法


public class Servicer implements Runnable {
 private Socket s = null;

 public Servicer(Socket s) {
  this.s = s;
 }

 public void run() {
  try {
   InputStream ips=s.getInputStream();
   OutputStream ops=s.getOutputStream();
   BufferedReader br=new BufferedReader(new InputStreamReader(ips));
   PrintWriter pw=new PrintWriter(ops,true);
   while(true){
   String strLine=br.readLine();
   if(strLine.equalsIgnoreCase("quit")){
   break;
   }
   String strEcho=(new StringBuffer(strLine).reverse()).toString();
   pw.println(strLine+"-->"+strEcho);


   }
   br.close();
   pw.close();
   s.close();
  } catch (IOException e) {
   e.printStackTrace();
  }
  
 }
}

 

public class ReverseServer {

 public static void main(String[] args){
  try {
   ServerSocket ss=new ServerSocket(8001);
   boolean bRunning=true;
   while(bRunning){
    Socket s=ss.accept();
    new Thread(new Servicer(s)).start();
   }
   ss.close();
  } catch (IOException e) {
     e.printStackTrace();
  }
  
 }

}


如何检测和解决端口冲突问题
使用netstat命令来查看当前正在被使用的TCP端口号
通过一个配置参数来指定TCP服务程序所使用的端口
ServerSocket ss=null;
if(args.length<1){
ss=new ServerSocket(8001);
}
else{
ss=new ServerSocket(Integer.parseInt(args[0]));
}


将用户所指定的端口号保存到一个文件中,当服务器程序下次启动运行时,直接从文件中读取那个端口号
ServerSocket ss=null;
if(args.length<1){
ss=new ServerSocket(8001);--只需要改8001为硬盘文件的位置
}
else{
ss=new ServerSocket(Integer.parseInt(args[0]));
}

服务器程序通信的客户端


public class TcpClient{

public static viod main(String args[])throws Exception{
 if(args.length<2)
{
 System.out.println("Usege:java TcpClient ServerIP and Server");
return;
}
Socket s=new Socket(/*InetAddress.getAddress*/(args[0]),Integer.parseInt(args[1]));
InputStream ips=s.getInputStream();
OutputStream ops=s.getOutputStream();
BufferedReader brNet=new BufferedReader(new InputStreamReader(ips));
PrintWriter pw=new PrintWriter(ops,true);
BufferedReader brKeyBoard=
new BufferedReader(new InputStreamReader(System.in));
while(true){

String strWord=brKeyBoard.readLine();
pw.println(strWord);
if(strWord.equalsIgnoreCase("quit")){
break;
}
System.out.println(brNet.readLine());
}
pw.close();
brNet.close();
brKeyBoard.close();
s.close();
}
}


TCP网络连接上传递对象
ObjectInputStream和ObjectOutputStream可以从底层输入流中读取对象类型的数据和将对象类型的数据写入到底层输入流
使用ObjectInputStream和ObjectOutputStream来包装底层网络字节流,TCP服务器和TCP客户端之间就可以传递对象类型的数据

编程实例:通过网络传输java对象

public class ObjectClient {

 
 public static void main(String[] args) throws Exception{

  Socket s=new Socket("127.0.0.1",8001);
  InputStream ips=s.getInputStream();
  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);
  ois.close();
  s.close();

 }

}

 


public static void main(String[] args)throws Exception{
  ServerSocket ss=new ServerSocket(8001);
  Socket s=ss.accept();
  OutputStream ops=s.getOutputStream();
  ObjectOutputStream oos=new ObjectOutputStream(ops);
  Student stu=new Student(19,"jack",22,"Math");
  oos.writeObject(stu);//写入客户端
  oos.close();
  s.close();
  ss.close();

 }

}

 

public class Student {
 int id;
 String name;
 int age;
 String department;
 public Student(int id,String name,int age,String department){
  this.id=id;
  this.name=name;
  this.age=age;
  this.department=department;
 }
}

 


理解应用程序协议和网络通信协议
ftp协议是建立在TCP协议上面的一个文件传输的,tcp只保证能发送协议,不保证接收方能不能接收到,能不能辨认接收到的东西


区分asp、jsp网络编程的概念:是产生网站内容的一种语言

 

访问Internet网络资源:
URL:Uniform Resource Locator(统一资源管理符)
基本组成:协议、主机名、端口号、资源名


HTTP协议的会话过程:
客户端向服务端建立连接的请求
发出请求信息、发出响应信息、服务器关闭客服端的连接

了解HTTP消息头
connection用于指定处理完本次请求响应后,客户度与服务器是否继续保持连接。设置值可以为keep-Alive和close
Accept-Language用于指定客户机期望服务器返回的文档使用的国家语言,可以指定多个以逗号分隔的国家语言

GET /HTTP:1.1
Host:
Accept-Language:ar-bh,zh-cn
Connection:close

改回中文
GET /HTTP/1.1
Host:
Acception-Language:zh-cn,ar-bh
Connection:close


Content-Length用于表示实体字段的长度(字节数)

Range用于指定服务器只需返回文档中的部分内容及内容范围,有以下几种使用格式:
Range:bytes=100-599
Range:bytes=100-  100字节以后
Range:bytes=-100  最后100个字节的内容

Content-Range
用于指定服务器返回的部分实体内容的位置信息,例如,
Content-Range:bytes 2543-4532/7898

URL类:
构造函数(都可以引发MalformedURLException异常);
public URL(String spec)
public URL(String protocol,String host,int port,Stirng file)
public URL(String protocol,String host,int port,String file,URLStramHandler handler)
public URL(URL context,String spec)

getProtocol、getHost getPort getFile

openConcection方法返回URLConnection对象


工厂设计模式
URL类的setURLStreamHandlerFactory(URLStreaHandlerFactory fac)静态方法

StreamHandlerFactory类的createURLStreamHandler(String protocol)方法

 

URLConnection与HttpURLConnection类

 

public static void main(String args[])throws Exception{
System.out.println("获取日文页面");
getContenByLanguage("ja");
System.out.println("\n");
System.out.println("获取中文页面");
getContenByLanguage("zh-cn");
}

public static void getContenByLanguage(String country)throws Exception{
URL urlGoole=new URL("http://www.google.com");
HttpURLConnection googleConnection=(HttpURLConnection)urlGoole.openConnection();
googleConnection.setRequestProperty("Accept-Language",country);

Map requests=googleConnection.getRequestProperties();
Set reqFields=requests.keySet();
Iterator itrReq=reqFields.iterator();
while(itrReq.hasNext()){
String field=(String)itrReq.next();
System.out.println(field+":"+googleConnection.getRequestProperty(field));

googleConnection.connect();

Map responses=googleConnection.getHeaderFields();
Set resFields=responses.keySet();
Iterator itrrReq=reqFields.iterator();
while(itrReq.hasNext()){}
String fieldd=(String)itrReq.next();
System.out.println(fieldd+":"+googleConnection.getHeaderField(field));

InputStream is=googleConnection.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String strLine=null;
while((strLine=br.readLine())!=null)
{
System.out.println(strLine);
}
br.close();
googleConnection.disconnect();
}
}
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值