JavaSocket编程要点,,



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

		}
	}
}










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值