1.URL类
java.net包中的URL类是对统一资源定位符的抽象,一个URL对象通常包含三部分信息,协议、地址和资源。
Internet上的主机可以用两种方式表示地址:IP地址、域名.
IP地址:电子设备(计算机)在网络中的唯一标识。
端口:应用程序在计算机中的唯一标识。0-65535
传输协议:规定了数据传输的规则
基础协议: TCP:安全协议,三次握手。速度稍慢。 UDP:不安全协议。速度快。
网络程序设计通常涉及一个服务器和一个或多个客户端。
服务器:从广义上讲,是指网络中能对其它机器提供某些服务的计算机系统.
客户端:向服务器发送请求,而服务器响应请求。
URL对象调用openStream()方法可以返回一个输入流,该输入流指向URL对象所包含的资源。通过该输入流可以将服务器上的资源信息读入客户端。
2.套接字
IP地址用来标识计算机,端口号用来标识正在计算机运行的进程。
端口号是一个整数,范围0-65535,其中0-1023已被预先定义的服务器通信占用,自己写的程序应该使用后面的端口号。
套接字:IP地址和端口号的组合。
3.客户端套接字
客户端的程序使用Socket类建立负责连接到服务器的套接字对象。
Socket(String host,int port); host代表服务器的IP地址,port代表端口号。
Socket socket=new Socket("127.0.0.1",4331);
通过getInputStream()获得输入流,读取服务器传过来的数据。
通过getOutputStream()获得输出流,向服务器写数据。
4.服务端套接字
服务端使用ServerSocket类创建对象,与客户端的套接字对象建立连接。
ServerSocket(int port);port必须与客户端呼叫的端口号相同
ServerSocket server=new ServerSocket(4331);
Socket client=server.accept(); 调用accept()方法等待客户端的连接。
总结:
Socket网络编程可分为四个基本步骤:
A) 建立网络连接;
B)打开连接到Socket的输入/输出流;
C) 通过已打开的I/O流进行数据读/写操作;
D) 关闭已打开的I/O流和Socket
下面是客户端与服务器的交互代码:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
public class Serve服务器 {
public static void main(String[] args) throws SocketException {
// TODO Auto-generated method stub
DataInputStream in;
DataOutputStream out;
try {
ServerSocket s=new ServerSocket(4331);
System.out.println("等待客户端呼叫..");
Socket client=s.accept();
System.out.println("兔子开门");
in=new DataInputStream(client.getInputStream());
out=new DataOutputStream(client.getOutputStream());
while (true) { //死循环
double r=in.readDouble();//接收客户端发来的数据
System.out.println(r);
double ss=Math.PI*r*r;
out.writeDouble(ss); //服务器向客户端发送数据
// out.close();
}
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
import java.util.Random;
import java.util.Scanner;
import javax.swing.*;
import java.awt.Event;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class Client客户端 {
public static void main(String[] args) {
// TODO Auto-generated method stub
ClientWindow client = new ClientWindow();
}
}
class ClientWindow extends JFrame implements ActionListener {
JButton button1, button2;
JTextArea ta;
JPanel p;
JLabel label;
JTextField txt;
DataInputStream in;
DataOutputStream out;
public ClientWindow() {
init();
setTitle("client");
setLocation(200, 300);
setSize(400, 300);
setVisible(true);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
}
// 初始化界面
public void init() {
button1 = new JButton("连接服务器");
ta = new JTextArea();
p = new JPanel();
label = new JLabel("输入圆的半径:");
txt = new JTextField(10);
button2 = new JButton("发送");
p.add(label);
p.add(txt);
p.add(button2);
add(button1, BorderLayout.NORTH);
add(ta, BorderLayout.CENTER);
add(p, BorderLayout.SOUTH);
button1.addActionListener(this);
button2.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
if (arg0.getSource() == button1) {
try {
Socket client = new Socket("127.0.0.1", 4331);
in = new DataInputStream(client.getInputStream());
out = new DataOutputStream(client.getOutputStream());
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else if (arg0.getSource() == button2) {
double r = Double.parseDouble(txt.getText());
try {
out.writeDouble(r); // 客户端向服务器发送数据
double ss = in.readDouble();
ta.append("圆的面积为:" + ss); // 接受来自服务器的数据
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
运行结果截图: