java提供了URL类和URLConnection类来在一个相对比较高的层次上进行网络通信,以实现对Internet网络资源的访问。在各种网络服务器应用程序以及特殊协议应用在客户与服务器之间使用的通信组件内底层的核心通信机制都是使用传输层的接口的Socket机制来通信的。
用户使用Socket套接字一般有两个通信协议可供选择TCP和UDP。
TCP socket 建立应用程序间通信需要:
1.创建Socket,分别包括创建Socket对象和ServerSocket对象。
2.打开连接到Socket的输入输出流。Socket对象使用connect()方法发送请求,ServerSocket对象可用accept()方法来接受建立连接。
3.通过输入输出流进行读写操作。
4.关闭socket连接。使用close()方法。
例子:TCP服务器端程序:
package TCPSocket;
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.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
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 Server extends JFrame{
private static final long
serialVersionUID=1L;
private JTextArea enterArea;
private JTextArea displayArea;
private JButton sendButton;
private Box box;
private ObjectOutputStream output;
private ObjectInputStream input;
private ServerSocket server;
private Socket connection;
private int counter=1;
public Server() {
super("Server");
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(Server.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 run(){
try {
server=new
ServerSocket(5555,100);
while(true){
waitForConnection();
getStream();
processConnection();
closeConnection();
++counter;
}
} catch (EOFException e)
{
System.out.println("Client
terminated connection!");
// TODO:
handle exception
}catch (IOException e) {
e.printStackTrace();
// TODO:
handle exception
}
}
private void waitForConnection() throws
IOException {
displayArea.setText("Waiting
for connection...\n");
connection
=server.accept();
displayArea.append("Connection"+counter+"received
from"+connection.getInetAddress().getHostName());
enterArea.setEnabled(true);
sendButton.setEnabled(true);
}
private void getStream() throws IOException
{
output=new
ObjectOutputStream(connection.getOutputStream());
output.flush();
input=new
ObjectInputStream(connection.getInputStream());
}
private void processConnection() throws
IOException{
String
message="SERVER>>>
connection successful";
output.writeObject(message);
output.flush();
do {
try {
message=(String)input.readObject();
displayArea.append("\n"+message);
displayArea.setCaretPosition(displayArea.getText().length());
} catch
(ClassNotFoundException e) {
displayArea.append("\nUnknown
object type was received!");
//
TODO: handle exception
}
} while
(!message.equals("CLENT>>>terminate"));
}
private void closeConnection() throws
IOException{
displayArea.append("\nUser
terminatedd connection.");
enterArea.setEnabled(false);
sendButton.setEnabled(false);
output.close();
input.close();
connection.close();
}
private void sendData(String message){
try {
output.writeObject("SERVER>>>"+message);
output.flush();
displayArea.append("\nSERVER>>>"+message);
} catch (IOException e) {
displayArea.append("\nError
when writing object!");
// TODO:
handle exception
}
}