网络编程 TCP续

来源:互联网 发布:网络光端机型号 编辑:程序博客网 时间:2024/05/17 01:43

如何检测和解决端口冲突问题
①使用netstat命令查看当前正在被使用的端口号
②通过一个配置参数来指定TCP服务程序所使用的端口号
③将用户所指定的端口号保存到一个文件中,当服务器程序下次启动运行时,直接从文件中

读取那个端口号

 

 

TCP客户端程序的编写:
要求:连接服务器的IP地址和端口号不要固定编写在程序代码中,而是通过程序的运行时参数来指

定,以提供较好的灵活性和较高的通用性。

import java.net.*;
import java.io.*;
public class TcpClient {

 /**
  * @param args
  */
 public static void main(String[] args) throws Exception {
  // TODO Auto-generated method stub
  if(args.length<2){
   System.out.println("Usage:java TcpClient ServerIP

ServerPort");
   return;
  }
                //Socket s=new Socket(InetAddress.getByAddress(args[0]),args[1]);
  Socket s=new Socket(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;
   
  }
  else{
   
     System.out.println(brNet.readLine()); 
  }

  
  
  }
         pw.close();
  brNet.close();
  brKeyboard.close();
  s.close();
 }

}

 

 

 

在TCP网络连接上传递对象:
①ObjectInputStream和ObjectOutputStream可以从底层输入流中读取对象类型的数据和将对

象类型的数据写入到底层输出流。
②使用ObjectInputStream和ObjectOutputStream来包装底层网络字节流,TCP服务器和TCP客

户端之间就可以传递对象类型的数据。
③怎样理解应用程序协议和网络通信协议的关系:
ftp协议支持tcp协议吗。。。?

tcp协议可以保证计算机之间正确的传送数据,但是不保证接收方是否能理解发送方数据的意

义,而ftp协议是建立在tcp协议之上的,为在Internet网络上传送文件而定义的一种协议。

所以tcp协议相当于电话系统,而ftp协议相当于打电话的人所约定的语言规则

有的应用程序协议是在两个程序之间传递邮件,例如:smtp和pop3
有的应用程序协议是在两个程序之间传送文件:例如:ftp
有的应用程序协议是在两个程序之间传送3w网页,例如:http协议
应用程序协议可以按自己想要实现的功能自己制定
④怎样区分ASP、JSP与网络编程的概念
网络编程制造卫星系统,ASP、JSP制作电视节目。

 

 

关于Serializable:
1.Serializabe 即序列化,就是为了保存在内存中的各种对象的状态(也就是实例变量,不

是方法),并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来

保存object states,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是

序列化。
2.什么情况下需要序列化  
    a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
    b)当你想用套接字在网络上传送对象的时候;
    c)当你想通过RMI(Remote Method Invocation 远程方法调用)传输对象的时候;
3、当对一个对象实现序列化时,究竟发生了什么?
    在没有序列化前,每个保存在堆(Heap)中的对象都有相应的状态(state),即实例变

量(instance ariable)比如:
   
java 代码
1.Foo  myFoo = new Foo(); 
2.myFoo .setWidth(37); 
3.myFoo.setHeight(70); 
     
       当 通过下面的代码序列化之后,MyFoo对象中的width和Height实例变量的值(37,

70)都被保存到foo.ser文件中,这样以后又可以把它 从文件中读出来,重新在堆中创建原

来的对象。当然保存时候不仅仅是保存对象的实例变量的值,JVM还要保存一些小量信息,比

如类的类型等以便恢复原来的对 象。

java 代码
1.FileOutputStream fs = new FileOutputStream("foo.ser"); 
2.ObjectOutputStream os = new ObjectOutputStream(fs); 
3.os.writeObject(myFoo);
使用Serializable注意事项:
    a)序列化时,只对对象的状态进行保存,而不管对象的方法;
    b)当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;
    c)当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;
    d)并非所有的对象都可以序列化,,至于为什么不可以,有很多原因了,比如:
        1.安全方面的原因,比如一个对象拥有private,public等field,对于一个要传输

的对象,比如写到文件,或者进行rmi传输  等等,在序列化进行传输的过程中,这个对象的

private等域是不受保护的。
       2. 资源分配方面的原因,比如socket,thread类,如果可以序列化,进行传输或者

保存,也无法对他们进行重新的资源分  配,而且,也是没有必要这样实现。

 

 

编程实例:

通过网络传输Java对象(为方便测试,本例将IP号和端口号固定写在了代码中)。
需要传递的对象类:Student类:
package ObjectTcp;
import java.io.*;
import java.net.*;
//当使用套接字在网络上传递对象的时候需要序列化,所以需要实现Serializable接口
public class Student implements Serializable{
      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;
      }
}
服务器端类,ObjectServer类:
package ObjectTcp;
import java.io.*;
import java.net.*;
public class ObjectServer {

 /**
  * @param args
  */
 public static void main(String[] args)throws Exception {
  // TODO Auto-generated method stub
  ServerSocket ss=new ServerSocket(8001);
  Socket s=ss.accept();
  OutputStream ops=s.getOutputStream();
        ObjectOutputStream oos=new ObjectOutputStream(ops);
        Student stu=new Student(1,"wangwu",23,"jiangguan");
        oos.writeObject(stu);
        oos.close();
        ops.close();
        s.close();
        ss.close();
 }

}
客户端类,OjectClient类:
package ObjectTcp;
import java.io.*;
import java.net.*;
public class ObjectClient {

 /**
  * @param args
  */
 public static void main(String[] args) throws Exception{
  // TODO Auto-generated method stub
        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();
        ips.close();
        s.close();
 }

}
程序运行结果在客户端返回了服务器端的stu对象并打印出来

原创粉丝点击