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();
			}

		}
	}
}










Java Socket编程是利用Java语言提供的Socket类和ServerSocket类,实现TCP/IP协议的网络编程。它可以实现客户端和服务器之间的双向通信。 下面是一个简单的Java Socket编程示例: 1. 服务器端代码 ```java import java.net.*; import java.io.*; public class Server { public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(8888); //创建服务器Socket,绑定端口号为8888 System.out.println("服务器已启动,等待客户端连接..."); Socket socket = server.accept(); //等待客户端连接,程序阻塞在此处 System.out.println("客户端已连接:" + socket.getRemoteSocketAddress()); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); //获取输入流 PrintWriter out = new PrintWriter(socket.getOutputStream()); //获取输出流 String msg; while ((msg = in.readLine()) != null) { //循环读取客户端发来的消息 System.out.println("客户端发来消息:" + msg); out.println("服务端已收到消息:" + msg); //将收到的消息回传给客户端 out.flush(); //刷新输出流 } in.close(); //关闭输入流 out.close(); //关闭输出流 socket.close(); //关闭Socket连接 server.close(); //关闭ServerSocket } } ``` 2. 客户端代码 ```java import java.net.*; import java.io.*; public class Client { public static void main(String[] args) throws IOException { Socket socket = new Socket("localhost", 8888); //创建客户端Socket,连接到本机的8888端口 System.out.println("连接成功:" + socket.getLocalSocketAddress()); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); //获取输入流 PrintWriter out = new PrintWriter(socket.getOutputStream()); //获取输出流 BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); //获取控制台输入流 String msg; while ((msg = reader.readLine()) != null) { //循环读取控制台输入的消息 out.println(msg); //将消息发送给服务器 out.flush(); //刷新输出流 System.out.println("发送消息:" + msg); System.out.println("服务器回复:" + in.readLine()); //读取服务器回传的消息 } in.close(); //关闭输入流 out.close(); //关闭输出流 socket.close(); //关闭Socket连接 } } ``` 上面的代码演示了一个简单的客户端和服务器之间的通信,客户端向服务器发送消息,服务器收到消息后将消息回传给客户端。你可以根据实际需求,对这段代码进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值