《Java 网络编程与分布式计算》

Java API主要的网络包:java.net ; java.rmi ; org.omg.* ; JavaMail ; Java servlet

 

对象持久性和对象序列化:对象持久化可以在JVM之前转移,不管这些JVM是否位于同一台机器上还是在远程机器上

 

TCP 通过可靠的递交和定序,在支持双向通信的客户和服务器之间提供可靠的字节通信

套接字选项:so_keepalive,so_revbuf,so_sndbuf,so_linger,tcp_nodelay,so_timeout,

 

多线程应用程序:

1,创建线程时并没有调用run() 方法,只有当调用start() 方法启动线程时,run() 方法才被调用。

如果只有守护线程在运行,那么JVM将会自动终止。

2,中断线程可能会唤起其他线程,

3,Thread.yield()让出CPU时间

sleep()使当前线程进入停滞状态,所以执行sleep()的线程在指定的时间内肯定不会执行;yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。
sleep()可使优先级低的线程得到执行的机会,当然也可以让同优先级和高优先级的线程有执行的机会;yield()只能使同优先级的线程有执行的机会。

当调用wait()后,线程会释放掉它所占有的“锁标志”,从而使线程所在对象中的其它 synchronized数据可被别的线程使用。

waite()和notify()因为会对对象的“锁标 志”进行操作,所以它们必须在synchronized函数或synchronized block中进行调用。如果在non-synchronized 函数或non-synchronized block中进行调用,虽然能编译通过,但在运行时会发生 IllegalMonitorStateException的异常

 

同步:方法级别的和程序块级别的同步

线程组

数据包发送接收


serversocket和socket的区别

ServerSocket用于绑定端点,提供服务,并接受连接请求,如果写服务器一定要用到的 Socket就是普通的连接套接字,做客户端要用到,设计服务器的时候也要用到。服务套接字accept之后返回的是Socket对象

所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。

Socket和 ServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应 用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户 端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。

重要的Socket API:

java.net.Socket继承于java.lang.Object,有八个构造器,其方法并不多,下面介绍使用最频繁的三个方法,其它方法大家可以见JDK-1.3文档。

.Accept方法用于产生"阻塞",直到接受到一个连接,并且返回一个客户端的Socket对象实例。"阻塞"是一个术语,它使程序运行暂时"停留"在这个地方,直到一个会话产生,然后程序继续;通常"阻塞"是由循环产生的。

.getInputStream方法获得网络连接输入,同时返回一个IutputStream对象实例,。

.getOutputStream方法连接的另一端将得到输入,同时返回一个OutputStream对象实例。

注意:其中getInputStream和getOutputStream方法均会产生一个IOException,它必须被捕获,因为它们返回的流对象,通常都会被另一个流对象使用。

 

GET请求方式 带两个参数:资源的路径以及使用的HTTP版本

POST请求方法: 客户HTTP POST请求,首部,实体主体

 

客户请求首部域:“Cookie”域,“From”域,“If-Modified-Since”域,“Referer”域,“User-Agent”域

 

cookie的基本思想是避开HTTP的非状态性

在面向对象的系统中,通过象对象传递一个指向事件源的对象引用(监听者)实现回掉。

 

java rmi 
《Java 网络编程与分布式计算》_第1张图片

 

写道
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.UnknownHostException;


public class PacketSendDemo {
public static void main(String args[]){
int argc=args.length;

if(argc != 1){
System.out.println("Syntax :");
System.out.println("java PacketSendDemo hostname");
return;
}
String hostname=args[0];
try{
System.out.println("Binding to a local port");

DatagramSocket socket=new DatagramSocket();

System.out.println("Bound to local port"+ socket.getLocalPort());

ByteArrayOutputStream bout =new ByteArrayOutputStream();
PrintStream pout=new PrintStream(bout);
pout.print("Greetings!");

byte[] barray=bout.toByteArray();

DatagramPacket packet=new DatagramPacket(barray, barray.length);

System.out.println("Looking up hostname" + hostname);

InetAddress remote_addrAddress = InetAddress.getByName(hostname);

System.out.println("Hostname resolved as "+ remote_addrAddress.getHostAddress());
packet.setAddress(remote_addrAddress);             //可以看出数据报中含有目的IP端口以及数据
packet.setPort(2000);          // 数据报发送不需要建立收发之间的连接

socket.send(packet);
System.out.println("Packet sent!");


}catch (UnknownHostException uhe) {
// TODO: handle exception
System.err.println("Can't find host"+ hostname);
}catch (IOException ioe) {
System.err.println("Error -" +ioe);
// TODO: handle exception
}
}

}



import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;


public class PacketRecevieDemo {
public static void main( String args[]){
try{

System.out.println("Binding to local prot 2000");

DatagramSocket socket=new DatagramSocket(2000);
System.out.println("Bound to local port" + socket.getLocalPort());

DatagramPacket packet= new DatagramPacket(new byte[256], 256);
socket.receive(packet);

InetAddress remote_addr=packet.getAddress();
System.out.println("Sent by" + remote_addr.getHostAddress());
System.out.println("Sent from :" + packet.getPort());

ByteArrayInputStream bin=new ByteArrayInputStream(packet.getData());

for (int i=0;i<packet.getLength();i++){

int data=bin.read();
if(data==-1){
break;
}
else
System.out.println((char)data);
}
socket.close();
}catch (IOException ioe) {
System.err.println("Error -" +ioe);
// TODO: handle exception
}
}

}

你可能感兴趣的:(java,jvm,编程,.net,servlet)