java提供了URL类和URLConnection类来在一个相对比较高的层次上进行网络通信,以实现对Internet网络资源的访问。在各种网络服务器应用程序以及特殊协议应用在客户与服务器之间使用的通信组件内底层的核心通信机制都是使用传输层的接口的Socket机制来通信的。
用户使用Socket套接字一般有两个通信协议可供选择TCP和UDP。
UDP socket 建立应用程序间通信需要:
UDP 需要使用DatagramSocket和DatagramPacket类。
1.调用DatagramSocket类创建一个数据报通信的Socket对象,然后就可以收发数据报。
2.指明了目的地址和端口号的用来发送数据包,没有指明的用来接收数据报。
3.服务器端先建立数据报通信DatagramSocket,构建数据报格式DatagramPacket,接着就是接收数据包和发送数据包。
实例:
服务器端:
package UDPSocket;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
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 javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class UDPServer extends JFrame{
private static final long
serialVersionUID=1L;
private JTextArea enterArea;
private JTextArea displayArea;
private JButton sendButton;
private Box box;
DatagramSocket socket;
DatagramPacket inPacket;
DatagramPacket outPacket;
InetAddress clientAddress;
int clientPort;
byte[] msg=new byte[100];
String receiveMsg;
public UDPServer() {
super("UDPServer");
Container
container=getContentPane();
enterArea =new
JTextArea();
enterArea.setEnabled(false);
sendButton=new
JButton("Send");
sendButton.setEnabled(false);
sendButton.addActionListener(new
ActionListener() {
public void
actionPerformed(ActionEvent e) {
//
TODO Auto-generated method stub
if(enterArea.getText().equals("")){
JOptionPane.showMessageDialog(UDPServer.this,
"Warning! The sending content should not be
empty!","Warning",JOptionPane.WARNING_MESSAGE);
return;
}
else {
sendData(enterArea.getText());
enterArea.setText("");
}
}
});
displayArea=new
JTextArea();
displayArea.setBorder(BorderFactory.createLineBorder(Color.black));
displayArea.setFont(new
Font("Serif",Font.BOLD,14));
displayArea.setForeground(Color.BLUE);
displayArea.setEnabled(true);
container.add(Box.createRigidArea(new
Dimension(0,30)),BorderLayout.NORTH);
container.add(new
JScrollPane(displayArea),BorderLayout.CENTER);
box=Box.createHorizontalBox();
box.setBorder(BorderFactory.createTitledBorder("Enter
Message!"));
box.add(new
JScrollPane(enterArea));
box.add(sendButton);
container.add(box,BorderLayout.SOUTH);
setSize(500,300);
setVisible(true);
}
public void runServer(){
try {
while(true){
socket=new
DatagramSocket(5556);
prepareForConnection();
processConnection();
closeConnection();
}
}catch (IOException e) {
e.printStackTrace();
// TODO:
handle exception
}
}
private void prepareForConnection() throws
IOException {
displayArea.setText("Waiting
for connection...\n");
inPacket=new
DatagramPacket(msg, msg.length);
socket.receive(inPacket);
receiveMsg=new
String(inPacket.getData(),0,inPacket.getLength());
displayArea.append(receiveMsg+"\n");
clientAddress=inPacket.getAddress();
clientPort=inPacket.getPort();
sendData("Connected
successfully with server");
enterArea.setEnabled(true);
sendButton.setEnabled(true);
}
private void processConnection() throws
IOException{
do {
socket.receive(inPacket);
receiveMsg=new
String(inPacket.getData(),0,inPacket.getLength());
displayArea.append(receiveMsg+"\n");
displayArea.setCaretPosition(displayArea.getText().length());
} while
(!receiveMsg.equals("CLENT>>>terminate"));
}
private void closeConnection() throws
IOException{
displayArea.append("\nUser
terminatedd connection.");
enterArea.setEnabled(false);
sendButton.setEnabled(false);
socket.close();
}
private void sendData(String message){
try {
byte[]
temp=("SERVER>>>"+message).getBytes();
outPacket=new
DatagramPacket(temp, temp.length,clientAddress,clientPort);
socket.send(outPacket);
displayArea.append("SERVER>>>"+message+"\n");
} catch (IOException e) {
displayArea.append("\nError
when writing object!");
// TODO:
handle exception
}
}
public static void main (String
args[]){
UDPServer
server=new UDPServer();
server.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
server.runServer();
}
}
客户端:
package UDPSocket;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
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 javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class UDPClient extends JFrame{
private static final long
serialVersionUID=1L;
private JTextArea enterArea;
private JTextArea displayArea;
private JButton sendButton;
private Box box;
DatagramPacket inPacket;
DatagramPacket outPacket;
DatagramSocket socket;
InetAddress serverAddress;
int serverPort;
byte[] msg=new byte[100];
String receivedMsg;
private String
charServer;
public UDPClient(String host) {
super("Client");
charServer =host;
Container container=getContentPane();
enterArea=new JTextArea();
enterArea.setEnabled(false);
sendButton=new JButton("Send");
sendButton.addActionListener(new ActionListener()
{
public void
actionPerformed(ActionEvent event) {
// TODO
Auto-generated method stub
if(enterArea.getText().equals("")){
JOptionPane.showMessageDialog(UDPClient.this,
"Warning!The sending content should not be
empty!","Warning",JOptionPane.WARNING_MESSAGE);
return;
} else
{
sendData(enterArea.getText());
enterArea.setText("");
}
}
});
displayArea=new JTextArea();
displayArea.setBorder(BorderFactory.createLineBorder(Color.black));
displayArea.setFont(new
Font("Serif",Font.BOLD,14));
displayArea.setForeground(Color.BLUE);
container.add(Box.createRigidArea(new
Dimension(0,30)),BorderLayout.NORTH);
container.add(new
JScrollPane(displayArea),BorderLayout.CENTER);
box=Box.createHorizontalBox();
box.setBorder(BorderFactory.createTitledBorder("Enter
message"));
box.add(new JScrollPane(enterArea));
box.add(sendButton);
container.add(box,BorderLayout.SOUTH);
setSize(500,300);
setVisible(true);
}
public void runClient(){
try {
prepareConnection();
processConnection();
closeConnection();
} catch (Exception e) {
// TODO:
handle exception
e.printStackTrace();
}
}
private void prepareConnection(){
displayArea.setText("Attempting
a connection...");
try {
socket=new
DatagramSocket();
inPacket=new
DatagramPacket(msg,msg.length);
serverAddress=InetAddress.getByName(charServer);
serverPort=5556;
sendData("Trying
to connect to Server");
} catch (Exception e) {
System.out.println(e.toString());
System.exit(1);
// TODO:
handle exception
}
}
private void processConnection() throws
IOException{
do {
socket.receive(inPacket);
enterArea.setEnabled(true);
sendButton.setEnabled(true);
receivedMsg=new
String(inPacket.getData(),0,inPacket.getLength());
displayArea.append(receivedMsg+"\n");
displayArea.setCaretPosition(displayArea.getText().length());
} while
(!receivedMsg.equals("SERVER>>>terminate"));
}
private void closeConnection() throws
IOException{
displayArea.append("\nServer
terminated connection.");
enterArea.setEnabled(false);
sendButton.setEnabled(false);
socket.close();
}
private void sendData(String message){
try {
byte[]
temp=("CLIENT>>>"+message).getBytes();
outPacket=new
DatagramPacket(temp, temp.length,serverAddress,serverPort);
socket.send(outPacket);
displayArea.setText("CLIENT>>>"+message+"\n");
} catch (Exception e) {
// TODO:
handle exception
displayArea.append("\nError
when writing object");
}
}
public static void main(String args[]){
UDPClient client;
if(args.length==0){
client=new
UDPClient("127.0.0.1");
} else{
client=new
UDPClient(args[0]);
}
client.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
client.runClient();
}
}
加载中,请稍候......