---------------------- android培训、java培训、期待与您交流! ----------------------
1.TCP,传输控制协议(Transmission Control Protocol),是面向连接的通信协议。
2.UDP,用户数据报协议(User Datagram Protocol),是无连接通信协议。
3.Socket是网络驱动层提供给应用程序编程的接口和一种机制。
4.DatagramSocket类用于UDP通信,ServerSocket类用于TCP通信的服务器端,Socket类用于TCP通信的服务器和客户端。
5.InetAddress类是用于表示计算机IP地址的一个类
6.最简单的UDP程序:
import java.io.IOException;
import java.net.*;
public class UdpSend {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
DatagramSocket ds = new DatagramSocket();
String strInfo = "hello www.xy邢勇.com";
ds.send(new DatagramPacket(strInfo.getBytes(),strInfo.getBytes().length,InetAddress.getByName("192.168.1.100"),3000));
ds.close();
}
}
import java.io.IOException;
import java.net.*;
public class UdpRecv {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
DatagramSocket ds = new DatagramSocket(3000);
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,1024);
ds.receive(dp);
System.out.println(new String(dp.getData(),0,dp.getLength()) +
"from" + dp.getAddress().getHostAddress() + ":" + dp.getPort());
ds.close();
}
}
7.用UDP编写网络聊天程序:
分为三步:
1.编写图形用户界面
2.编写网络消息发送功能
3.编写网络消息接受功能
package chat;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
public class Chat extends Frame {
List lst = new List(6); // 列表框,最多显示6行,超过后用滚动条
TextField tfIP = new TextField(15); // ip地址输入文本框,最多显示15个
TextField tfData = new TextField(20); // 消息输入文本框,最多显示20个
DatagramSocket ds = null;
public Chat() {
try {
ds = new DatagramSocket(3000);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
this.add(lst, "Center");
Panel p = new Panel();
this.add(p, "South");
p.setLayout(new BorderLayout());
p.add(tfIP, "West");
p.add(tfData, "East");
new Thread(new Runnable() {
public void run() {
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, 1024);
while (true) {
try {
ds.receive(dp);
} catch (Exception e) {
if(!ds.isClosed()){
e.printStackTrace();
}
}
lst.add(new String(buf, 0, dp.getLength()) + " from "
+ dp.getAddress().getHostAddress() + ":"
+ dp.getPort(), 0);
}
}
}).start();
tfData.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
byte[] buf;
buf = tfData.getText().getBytes();
try {
DatagramPacket dp = new DatagramPacket(buf, buf.length,
InetAddress.getByName(tfIP.getText()), 3000);
ds.send(dp);
} catch (Exception ep) {
// TODO: handle exception
ep.printStackTrace();
}
tfData.setText("");
}
});
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
ds.close();
dispose();
System.exit(0);
}
});
}
public static void main(String args[]) {
System.out.println("Starting Chat..");
Chat mainFrame = new Chat();
mainFrame.setSize(300, 400);
mainFrame.setTitle("Chat");
mainFrame.setVisible(true);
mainFrame.setResizable(false);
}
}
8.TCP客户端程序与TCP服务器端程序的交互过程:
(1)服务器程序创建一个ServerSocket,然后调用accept方法等待客户来连接。
(2)客户端程序创建一个Socket并请求与服务器建立连接。
(3)服务器接受客户的连接请求,并创建一个新的Socket与该客户建立专线连接。
(4)建立了连接的两个Socket在一个单独的线程(由服务器程序创建)上对话。
(5)服务器开始等待新的连接请求,当新的连接请求到达时,重复步骤(2)到(5)的过程。
9.简单的TCP服务器程序:
import java.io.*;
import java.net.*;
public class TcpServer {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
ServerSocket ss = new ServerSocket(8001);
Socket s =ss.accept();
InputStream ips = s.getInputStream();
OutputStream ops = s.getOutputStream();
ops.write("welcome to www.xy.com".getBytes());
/*byte[] buf = new byte[1024];
int len = ips.read(buf); //实际读到的长度
System.out.println(new String(buf,0,len));*/
BufferedReader bf = new BufferedReader(new InputStreamReader(ips));
System.out.println(bf.readLine());
//ips.close();
bf.close();
ops.close();
s.close();
ss.close();
}
}
10.完善的TCP服务器程序模型实例:
服务器程序能够同时与多个客户端会话,客户端每次向服务器发送一行字符文本,服务器就将这行字符文本中的所有字符反向排列后回送给客户端,当客户端想服务器发送的一行字符文本内容为“quit”时,服务器结束与客户端的会话。
TCP服务器程序模型的编写要点:
(1)TCP服务器程序要想能接受多个客户端连接,需要循环调用ServerSocket.accept方法。
(2)服务器程序与每个客户端连接的会话过程不能相互影响,需要再独立的线程中运行。
(3)一个线程服务对象与一个服务器端Socket对象相关联,共同来完成与一个客户端的会话。
import java.net.*;
public class ReverseServer {
public static void main(String[] args){
try {
// TODO Auto-generated method stub
ServerSocket ss = new ServerSocket(8001);
boolean bRunning = true;
while (bRunning) {
Socket s = ss.accept();
new Thread(new Servicer(s)).start();
}
ss.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
import java.net.*;
import java.io.*;
public class Servicer implements Runnable{
private Socket s = null;
public Servicer(Socket s){
this.s = s;
}
public void run(){
try {
InputStream ips = s.getInputStream();
OutputStream ops = s.getOutputStream();
BufferedReader br = new BufferedReader(
new InputStreamReader(ips));
PrintWriter pw = new PrintWriter(ops,true);
while(true){
String strLine = br.readLine();
if(strLine.equalsIgnoreCase("quit")){
break;
}
System.out.println(strLine);
String strEcho = new StringBuffer(strLine).reverse().toString();
pw.println(strLine + "-->" + strEcho);
}
br.close();
pw.close();
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
11.使用netstat命令查看当前正在被使用的TCP端口号。
12.URL(统一资源定位符)的基本组成:协议、主机名、端口号、资源名。
13.URLConnection与HttpURLConnection类编程实例:
将访问www.google.com站点的HTTP请求消息的Accept-Language头分别设置成日文和中文后,然后打印出www.google.com站点返回的所有响应消息头和网页内容。
import java.net.*;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.io.*;
public class GetGoogle {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
System.out.println("获取日文页面");
getContentByLanguage("ja");
System.out.println("\n");
System.out.println("获取中文页面");
getContentByLanguage("zh-cn");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void getContentByLanguage(String country) throws Exception{
URL urlGoogle = new URL("http://www.google.com");
HttpURLConnection googleConnection = (HttpURLConnection)urlGoogle.openConnection();
googleConnection.setRequestProperty("Accept-Language",country);
Map requests = googleConnection.getRequestProperties();
Set reqField = requests.keySet();
Iterator itrReq = reqField.iterator();
while(itrReq.hasNext()){
String field = (String) itrReq.next();
System.out.println(field + ":" +
googleConnection.getRequestProperty(field));
}
Map responses = googleConnection.getHeaderFields();
Set resFields = responses.keySet();
Iterator itrRes = resFields.iterator();
while(itrRes.hasNext()){
String field = (String) itrRes.next();
System.out.println(field + ":" +
googleConnection.getHeaderField(field));
}
InputStream is = googleConnection.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String strLine = null;
while((strLine = br.readLine()) != null){
System.out.println(strLine);
}
br.close();
googleConnection.disconnect();
}
}
---------------------- android培训、java培训、期待与您交流! ----------------------