一、使用DatagramSocket和Datagrampacket类编写程序是Datagram通讯的表示方法,DatagramSocket用于在程序之间建立传送
数据报的通信连接, DatagramPacket则用来表示一个数据报(数据报神马的,最讨厌了,直接说传送的数据不就好了?)
DatagramSocket的构造方法有:
DatagamSocket();
DatagamSocket(int prot);
DatagramSocket(int port,InetAddress laddr);
//port指明socket所使用的端口号,如果未指明端口号,则把socket连接到本地主机上一个可用的端口。
//用这种方式写程序时,无论是接收者还是发送者都得建立一个DatagramSocket对象,作用是用来接收或者发送数据
DatagramPacket的构造方法有:
DatagramPacket(byte buf[],int length);
DatagramPacket(byte buf[], int length, InetAddress addr, int port);
DatagramPacket(byte[] buf, int offset,int length);
DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port);
//buf存放数据报数据,而length为数据的长度,address和port指明你的目的地的地址,offset指明了数据的位移量
//在DatagramPacket中,发送和接收数据需要调用一些语句,如下:
1、发送:
DatagramPacket packet=new DatagramPacket(buf, buf.length, address, port);
Socket.send(packet);
2、接收:
DatagramPacket packet=new DatagramPacket(buf,buf.length);
socket.receive(dp);
二、Datagram流编程和Socket流编程的明显区别在于:Socket编程是不提供监听功能的,也就是说通信的双方相对于Datagram
流而言更为平等,面对的接口也是完全一样的。额,还有一点就是,Socket编程里接收和发送都是用的一个端口,而
Datagram的发送端口和接收端口是不一样的。
三、Datagram的特点是可靠,传输大小无限制,需要建立连接,差错控制开销大。而Socket的特点是不可靠,但是差错控制开
销小,且不需要建立连接。
四、要写一个程序通讯的代码,首先要弄明白如何发送和接收数据,弄明白之后就简单了,程序通讯的代码其实很简单,创建
一个DatagramPacket对象,用来放你要发送的东西,简单而言:
DatagramSocket ds;
DatagramPacket dp=new DatagramPacket(buf, buf.length,InetAddress.getByName("localhost"),rp);
ds.send(dp);
//buf:你要发送的数据
//buf.length:你发送的数据的大小。(这个还要我解释么…→_→)
//InetAddress.getByName("xxx"):发送方的地址
//rp:接收方的地址(int型)
//你要发送什么,往dp里加东西就行,怎么加?→_→
//需要注意的是这里需要抛异常
OK,发送搞定了,到接收了,对于接收,我们一般都会写一个子线程,因为我们一般不会只接收一次就停止。
而接收的程序也很简单:
DatagramSocket ds;
DatagramPacket dp=new DatagramPacket(buf,buf.length);
ds.receive(dp);
package datagramSocketDemo;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;
public class DataStremSocket extends JFrame {
/**
*
*/
private static final long serialVersionUID = -7414557835664614783L;
JLabel jlb=new JLabel("Enter:");
JButton jbt=new JButton("Send");
JButton jtn=new JButton("Clear");
JTextField jtf=new JTextField(20);
JTextArea jta=new JTextArea(30,30);
JPanel up=new JPanel();
String name;
JScrollPane jp;
DatagramSocket ds;
int lp;
int rp;
Container c;
DR dr;
String name1;
public DataStremSocket(String name,final String name1,int lp,final int rp){
super("与"+name1+"聊天中");
this.lp=lp;
this.rp=rp;
this.name1=name1;
c=this.getContentPane();
c.setLayout(new BorderLayout());
up.add(jlb);
up.add(jtf);
up.add(jbt);
up.add(jtn);
int v=ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED;
int h=ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED;
jp=new JScrollPane(jta,v,h);
c.add(up,BorderLayout.NORTH);
c.add(jp,BorderLayout.CENTER);
jtn.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
jta.setText("");
}
});
jbt.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
String temp=jtf.getText();
String sg=jta.getText();
jta.setText(null);
jta.setText("您对"+name1+"说:"+temp+"\n"+sg);
jtf.setText("");
byte[] buf=temp.getBytes();
try {
DatagramPacket dp=new DatagramPacket(buf, buf.length,InetAddress.getByName("localhost"),rp);
ds.send(dp);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setSize(450, 300);
this.setVisible(true);
try {
ds=new DatagramSocket(lp);
dr=new DR(name,ds,jta,name1);
dr.start();
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args){
new DataStremSocket("danlotia Linyee","Cenlin Linyee",3000,5000);
new DataStremSocket("Cenlin Linyee","danlotia Linyee",5000,3000);
}
}
class DR extends Thread{
String name;
DatagramSocket ds;
JTextArea jta;
String name1;
public DR(String name,DatagramSocket ds,JTextArea jta,String name1){
this.name=name;
this.ds=ds;
this.jta=jta;
this.name1=name1;
}
public void run(){
while(true){
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
try {
ds.receive(dp);
String temp=new String(buf,0,dp.getLength());
String sg=jta.getText();
jta.setText(null);
jta.setText(name1+"对您说:"+temp+"\n"+sg);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}