您的位置:首页 > 编程语言 > Java开发

JavaSocket编程要点,,

2014-08-21 22:43 246 查看

一、使用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();
}

}
}
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  socket 通信 对象 dp