网络编程 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对象并打印出来
- 网络编程 TCP续
- TCP/IP网络编程
- TCP/IP网络编程
- dotnet 网络编程 tcp
- 网络编程TCP
- 网络编程 TCP
- 网络编程—TCP
- 网络编程(tcp文件服务器)
- TCP网络编程
- java 网络编程 TCP
- 网络编程--TCP协议
- TCP网络编程&&UDP
- QT网络编程-TCP
- 网络编程之TCP
- 网络编程 UDP TCP
- 网络编程--TCP
- 网络编程TCP
- 网络编程(TCP/UDP)
- 用sqlplus备份Oracle 数据库
- 什么是交叉编译
- PHP中添加memcache扩展支持
- 【转】Freebsd中监视系统性能状态的工具:systat
- aspnet_regiis 详解
- 网络编程 TCP续
- 学习笔记 第三章
- C# WinForm 控件在窗体中动态居中 创建、删除控件及对其赋值
- nginx学习(安装篇)
- C# WinForm开发系列 - 文章索引
- jboss 中,jdk版本不兼容问题的深入探究(转)
- linux下串口通信的调试和硬件检测
- PL/SQL Developer注册码
- java绘制图片工具类