您的位置:首页 > 理论基础 > 计算机网络

【黑马程序员】网络编程

2011-09-21 13:20 375 查看
---------------------- 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培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net/heima
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: