java教材源代码第11章 网络编程.docx
《java教材源代码第11章 网络编程.docx》由会员分享,可在线阅读,更多相关《java教材源代码第11章 网络编程.docx(28页珍藏版)》请在冰点文库上搜索。
![java教材源代码第11章 网络编程.docx](https://file1.bingdoc.com/fileroot1/2023-5/23/dc64b906-67db-4cbc-9562-0fc2d1f32d86/dc64b906-67db-4cbc-9562-0fc2d1f32d861.gif)
java教材源代码第11章网络编程
第11章网络编程
【例11-1】通过使用openStream()方法获取到URL:
//baidu/index.html的输入流,该流基础上创建一个BufferedReader,通过对BufferedReader流的读取操作,获取该URL中的数据并显示。
import.*;
importjava.io.*;
publicclassURLReader{
publicstaticvoidmain(String[]args)throwsException{
URLbaidu=newURL(":
//baidu/index.html");
BufferedReaderin=newBufferedReader(
newInputStreamReader(baidu.openStream()));
StringinputLine;
while((inputLine=in.readLine())!
=null)
System.out.println(inputLine);
in.close();
}
}
【例11-2】利用URLConnection类的对象读取:
//baidu页面信息。
import.*;
importjava.io.*;
publicclassURLConnectionReader{
publicstaticvoidmain(String[]args)throwsException{
URLbaidu=newURL(":
//baidu/");
URLConnectionbd=baidu.openConnection();
BufferedReaderin=newBufferedReader(
newInputStreamReader(bd.getInputStream()));
StringinputLine;
while((inputLine=in.readLine())!
=null)
System.out.println(inputLine);
in.close();
}
}
【例11-3】利用TCP协议socket通讯的客户方实现。
//Server端程序MyServer.java
importjava.io.*;
import.*;
publicclassMyServer{
publicstaticvoidmain(Stringargs[]){
try{
//建立ServerSocket并等待连接请求。
ServerSocketserver=newServerSocket(1680);
Socketsocket=server.accept();
//连接建立,通过Socket获取连接上的输入/输出流。
BufferedReaderin=newBufferedReader(
newInputStreamReader(socket.getInputStream()));
PrintWriterout=newPrintWriter(socket.getOutputStream());
//创建标准输入流,从键盘接收数据。
BufferedReadersin=newBufferedReader(
newInputStreamReader(System.in));
//先读取Client发送的数据,然后从标准输入读取数据发送给Client。
//当接收到bye时关闭连接。
Strings;
while(!
(s=in.readLine()).equals("bye")){
System.out.println("#ReceivedfromClient:
"+s);
out.println(sin.readLine());
out.flush();
}
System.out.println("Theconnectionisclosing......");
//关闭连接。
in.close();
out.close();
socket.close();
server.close();
}catch(Exceptione){
System.out.println("Error:
"+e);
}
}
}
//Client端程序MyClient.java
importjava.io.*;
import.*;
publicclassMyClient{
publicstaticvoidmain(Stringargs[]){
try{
Socketsocket=newSocket("127.0.0.1",1680);//发出连接请求。
//连接建立,通过Socket获取连接上的输入/输出流。
PrintWriterout=newPrintWriter(socket.getOutputStream());
BufferedReaderin=newBufferedReader(newInputStreamReader(
socket.getInputStream()));
//创建标准输入流,从键盘接收数据。
BufferedReadersin=newBufferedReader(
newInputStreamReader(System.in));
//从标准输入中读取一行,发送Server端,当用户输入bye时结束连接。
Strings;
do{
s=sin.readLine();
out.println(s);
out.flush();
if(!
s.equals("bye")){
System.out.println("@Serverresponse:
"+in.readLine());
}else{
System.out.println("Theconnectionisclosing......");
}
}while(!
s.equals("bye"));
//关闭连接。
out.close();
in.close();
socket.close();
}catch(Exceptione){
System.out.println("Error"+e);
}
}
}
【例11-4】数据报通信方式实现Client/Server通信
//Server端程序MyUdpServer.java
importjava.io.*;
import.*;
publicclassMyUdpServer{
DatagramSocketsocket=null;
BufferedReaderin=null;
booleanmoreQuotes=true;
publicvoidserverWork()throwsIOException{
socket=newDatagramSocket(4445);//创建数据报Socket。
in=newBufferedReader(newFileReader("myfile.txt"));
while(moreQuotes){
//构造接收数据报并启动接收。
byte[]buf=newbyte[256];
DatagramPacketpacket=newDatagramPacket(buf,buf.length);
socket.receive(packet);
/*
*接收Client端的数据报。
从sentences.txt中读取一行,作为响应数据报中数据。
*/
StringdString=null;
if((dString=in.readLine())==null){
in.close();
moreQuotes=false;
dString="Nomoresentences.Bye.";
}
buf=dString.getBytes();
/*
*从接收到的数据报中获取Client端的地址和端口,构造响应数据报并发送。
*/
InetAddressaddress=packet.getAddress();
intport=packet.getPort();
packet=newDatagramPacket(buf,buf.length,address,port);
socket.send(packet);
}
socket.close();//所有句子发送完毕,关闭Socket。
}
publicstaticvoidmain(String[]args){
MyUdpServerserver=newMyUdpServer();
try{
server.serverWork();
}catch(IOExceptione){
}
}
}
//Client端程序MyUdpClient.java
importjava.io.*;
import.*;
publicclassMyUdpClient{
publicstaticvoidmain(String[]args)throwsIOException{
//创建数据报Socket。
DatagramSocketsocket=newDatagramSocket();
//构造请求数据报并发送。
byte[]buf=newbyte[256];
InetAddressaddress=InetAddress.getByName("localhost");
DatagramPacketpacket=newDatagramPacket(buf,buf.length,address,4445);
socket.send(packet);
//构造接收数据报并启动接收。
packet=newDatagramPacket(buf,buf.length);
socket.receive(packet);
//收到Server端响应数据报,获取数据并显示。
Stringreceived=newString(packet.getData());
System.out.println("Thesentencesendbytheserver:
\n"+received);
socket.close();//关闭Socket。
}
}
11.4案例分析一:
C/S模式下的文件内容传递
本例的代码如下:
//TalkServer.java
importjava.io.*;
import.*;
publicclassTalkServer{
publicstaticvoidmain(Stringargs[]){
try{
ServerSocketserver=null;
server=newServerSocket(4700);
System.out.println("Started:
"+server);
Socketsocket=server.accept();//负责C/S通信的socket对象
System.out.println("server:
"+socket);
//获取对应的Socket的输入输出流
BufferedReaderis;
is=newBufferedReader(newInputStreamReader(
socket.getInputStream()));
PrintWriteros=newPrintWriter(
socket.getOutputStream());
FilesourceFile;
BufferedReadersource;
System.out.println("等待客户端的消息....");
Stringstr=is.readLine();//读取客户端传送的字符串
System.out.println("客户端"+str);//显示字符串
sourceFile=newFile(str);
System.out.println("给客户端发送:
");
try{
source=newBufferedReader(
newFileReader(sourceFile));
while((str=source.readLine())!
=null){
os.println(str);//向客户端发送消息
}
os.println("end");
}catch(FileNotFoundExceptione){
System.out.println("文件不存在:
"+e);
os.println("NotFile");
}
os.close();
is.close();
socket.close();
server.close();
}catch(Exceptione){
System.out.println("Error:
"+e);
}
}
}
//TalkClient.java
importjava.io.*;
import.*;
publicclassTalkClient{
publicstaticvoidmain(Stringargs[]){
try{
Socketsocket=newSocket("127.0.0.1",4700);
System.out.println("server:
"+socket);
BufferedReadersin;
sin=newBufferedReader(
newInputStreamReader(System.in));
PrintWriteros=newPrintWriter(
socket.getOutputStream());
BufferedReaderis;
is=newBufferedReader(
newInputStreamReader(socket.getInputStream()));
System.out.println("发送字符串");
Stringreadline=sin.readLine();//读取用户输入的字符串
os.println(readline);//将字符串传送给服务器端
os.flush();
System.out.println("等待获取服务器获得字符串");
if(readline.equals("Not/file")){
System.out.println(readline);
thrownewFileNotFoundException("文件不存在异常!
");
}
while(true){
readline=is.readLine();//获取服务器获得的字符串
if(readline.equals("end"))
break;
System.out.println(readline);
}
os.close();
is.close();
socket.close();
}catch(Exceptione){
System.out.println("异常"+e);
}
}
}
文本文件s1.txt的内容如下:
账号账户名密码
1001Jack6780
1002Rose6066
1003Tom1234
11.5案例分析二:
基于TCP/IP的多线程电子白板
3.案例实现
//服务器端ServerSocket程序:
drawing.java
//====================ProgramDiscription==========================
//程序名称:
drawing.java
//程序目的:
TCP服务器端Socket编程
//===================================================================
packagedrawing;
import.*;
//建立Drawing类,继承Frame类
publicclassDrawingextendsDraw{
ReadThreadread;
publicDrawing(){
super();
this.setTitle("服务器端");
}
//显示Drawing
publicstaticvoidmain(String[]args){
Drawingdr=newDrawing();
dr.show();
//生成服务器端的Socket,启动Socket服务
try{
ServerSocketserver=newServerSocket(8189);
for(;;){
Socketsocket=server.accept();
ReadDrawThreadreaddraw=newReadDrawThread(socket,dr);
WriteDrawThreadwritedraw=newWriteDrawThread(socket,dr);
readdraw.start();
writedraw.start();
}
}
catch(Exceptionex){
ex.printStackTrace();
}
}
}
//客户端Socket程序:
ClientDrawing.java
//====================ProgramDiscription==========================
//程序名称:
ClientDrawing.java
//程序目的:
TCP客户端ServerSocket编程
//===================================================================
packagedrawing;
import.*;
publicclassClientDrawingextendsDraw{
ReadThreadread;
publicClientDrawing(){
super();
this.setTitle("客户端");
}
//显示Drawing
publicstaticvoidmain(String[]args){
ClientDrawingdr=newClientDrawing();
dr.show();
//生成客户端Socket,请求与服务器Socket连接
try{
Socketsocket=newSocket("localhost",8189);
ReadDrawThreadreaddraw=newReadDrawThread(socket,dr);
WriteDrawThreadwritedraw=newWriteDrawThread(socket,dr);
readdraw.start();
writedraw.start();
}
catch(Exceptionex){
ex.printStackTrace();
}
}
}
//运行界面程序:
Draw.java
//====================ProgramDiscription========================
//程序名称:
Draw.java
//程序目的:
Drawing类和ClientDrawing的父类,定义统一风格的界面
//==============================================================
packagedrawing;
importjava.awt.*;
importjava.awt.event.*;
importjava.util.Vector;
importjava.util.Enumeration;
import.*;
//建立Drawing类,继承Frame类
publicclassDrawextendsFrame{
//建立menu菜单栏
MenuBarmenuBar=newMenuBar();
Menuchoose=newMenu("选择图形");
MenuItemchooseLine=newMenuItem("直线");
MenuItemchooseOval=newMenuItem("圆形");
//生成开始和结束的点,初始值为原点(0,0)
PointstartPoint=newPoint(0,0);
PointendPoint=newPoint(0,0);
Stringtype="Line";
//end=false,发送文本初始值为假
booleanend=false;
Paneldp=newPanel();
TextFieldmes=newTe