ch33 实验十七 网络编程一Socket通信.docx
《ch33 实验十七 网络编程一Socket通信.docx》由会员分享,可在线阅读,更多相关《ch33 实验十七 网络编程一Socket通信.docx(26页珍藏版)》请在冰豆网上搜索。
![ch33 实验十七 网络编程一Socket通信.docx](https://file1.bdocx.com/fileroot1/2022-11/26/e5689af0-8406-4299-8d7d-2ab5eb6e6c8d/e5689af0-8406-4299-8d7d-2ab5eb6e6c8d1.gif)
ch33实验十七网络编程一Socket通信
实验Scoket编程知识
一.实验目的:
1.掌握JDK的安装和环境变量的配置
2.掌握WTK的安装
3.能够使用JDK和WTK完成基本的实验内容
二.实验内容
javax.microedition.io包中的内容构成了通用连接框架
Socket通信开发流程:
1.服务器监听某个端口
2.客户端连接服务器某个端口
3.通过SocketConnection通信
服务器监听某个端口:
服务器端IP通过ssc的getLocalAddress()获得,例如127.0.0.1
1.通过javax.microedition.io.ServerSocketConnetion接口
2.java.microedition.io.Connector负责建立各种连接
open("socket:
//:
端口"),返回ServerSocketConnection
3.如果有客户端连接上来,可以用ServerSocketConnection.accepteAndOpen()返回SocketConnection
SocketConnection重要方法:
1.getAddress():
2.openDataInputStream/openInputStream:
打开输入流
3.openDataOutputStream/openOutputStream:
打开输出流
案例1:
客户端与服务器端建立连接
●ClientMIDlet1.java文件
importjavax.microedition.io.Connector;
//客户端
publicclassClientMIDlet1extendsMIDlet{
protectedvoiddestroyApp(booleanarg0)throwsMIDletStateChangeException{}
protectedvoidpauseApp(){}
protectedvoidstartApp()throwsMIDletStateChangeException{
try{
Connector.open("socket:
//127.0.0.1:
9999");
}catch(Exceptionex){
ex.printStackTrace();
}
}
}
●ServerMIDlet1.java文件
importjavax.microedition.io.Connector;
importjavax.microedition.io.ServerSocketConnection;
//服务器端
publicclassServerMIDlet1extendsMIDlet{
publicServerMIDlet1(){}
protectedvoiddestroyApp(booleanarg0)throwsMIDletStateChangeException{}
protectedvoidpauseApp(){}
protectedvoidstartApp()throwsMIDletStateChangeException{
try{
//监听某个端口
ServerSocketConnectionssc
=(ServerSocketConnection)Connector.open("socket:
//:
9999");
//等待客户端连接,如果没有客户端连接,程序在这里阻塞
System.out.println(ssc.getLocalAddress());//获取IP地址
System.out.println(ssc.getLocalPort());//获取端口号
ssc.acceptAndOpen();
}catch(Exceptionex){ex.printStackTrace();
}
}
}
案例2:
客户端与服务器端建立连接.
客户端向服务器端发送“Hello”,服务器端向客户端发送“Welcometojoinus”
●ClientMIDlet2.java文件
importjava.io.DataInputStream;
importjava.io.DataOutputStream;
importjavax.microedition.io.Connector;
importjavax.microedition.io.SocketConnection;
importjavax.microedition.midlet.MIDlet;
importjavax.microedition.midlet.MIDletStateChangeException;
//客户端
publicclassClientMIDlet2extendsMIDlet{
protectedvoiddestroyApp(booleanarg0)throwsMIDletStateChangeException{}
protectedvoidpauseApp(){}
protectedvoidstartApp()throwsMIDletStateChangeException{
try{
//连接到服务器端,连接成功,返回的SocketConnection充当通信桥梁
SocketConnectionsc
=(SocketConnection)Connector.open("socket:
//127.0.0.1:
9999");
/*以后就可以通过sc与服务端通信*/
DataOutputStreamdos=sc.openDataOutputStream();
//输出信息
dos.writeUTF("Hello");
DataInputStreamdis=sc.openDataInputStream();
Stringmsg=dis.readUTF();
System.out.println(msg);
}catch(Exceptionex){
ex.printStackTrace();
}
}
}
●ServerMIDlet2.java文件
importjava.io.DataInputStream;
importjava.io.DataOutputStream;
importjavax.microedition.io.Connector;
importjavax.microedition.io.ServerSocketConnection;
importjavax.microedition.io.SocketConnection;
importjavax.microedition.midlet.MIDlet;
importjavax.microedition.midlet.MIDletStateChangeException;
//服务器端
publicclassServerMIDlet2extendsMIDlet{
publicServerMIDlet2(){}
protectedvoiddestroyApp(booleanarg0)throwsMIDletStateChangeException{}
protectedvoidpauseApp(){}
protectedvoidstartApp()throwsMIDletStateChangeException{
try{
//监听某个端口
ServerSocketConnectionssc
=(ServerSocketConnection)Connector.open("socket:
//:
9999");
//等待客户端连接,如果有客户端链接,acceptAndOpen方法返回的StreamConnection强制转换为SocketConnection充当通信桥梁
SocketConnectionsc=(SocketConnection)ssc.acceptAndOpen();
/*以后就可以通过sc与客户端通信*/
System.out.println("客户端:
"+sc.getAddress());
DataInputStreamdis=sc.openDataInputStream();
Stringmsg=dis.readUTF();
System.out.println(msg);
DataOutputStreamdos=sc.openDataOutputStream();
//输出信息
dos.writeUTF("Welcometojoinus");
}catch(Exceptionex){
ex.printStackTrace();
}
}
}
案例3:
简单聊天室程序(未经过优化,会抛出异常)
●ChatClientMIDlet.java文件//优化之前文件
publicclassChatClientMIDletextendsMIDletimplementsCommandListener{
privateSocketConnectionsc=null;
//*********①
privateCommandcmdSend=newCommand("发送",Command.SCREEN,1);
privateFormfrmChat=newForm("聊天界面");
privateTextFieldtfMsg=newTextField("输入聊天信息","",255,TextField.ANY);
privateDisplaydisplay;
protectedvoiddestroyApp(booleanarg0)throwsMIDletStateChangeException{}
protectedvoidpauseApp(){}
protectedvoidstartApp()throwsMIDletStateChangeException{
display=Display.getDisplay(this);
display.setCurrent(frmChat);
frmChat.addCommand(cmdSend);
frmChat.append(tfMsg);
frmChat.setCommandListener(this);
try{
sc=(SocketConnection)Connector.open("socket:
//127.0.0.1:
9999");
//*********②
newReceiveThread().start();
}catch(Exceptionex){
ex.printStackTrace();
}
}
publicvoidcommandAction(Commandc,Displayabled){
if(c==cmdSend){
try{
DataOutputStreamdos=sc.openDataOutputStream();//*********③
dos.writeUTF(tfMsg.getString());
}catch(Exceptionex){
//ex.printStackTrace();
}
}
}
classReceiveThreadextendsThread{
publicvoidrun(){
while(true){
try{
DataInputStreamdis=sc.openDataInputStream();//*********④
Stringmsg=dis.readUTF();
frmChat.append(msg+"\n");
}catch(Exceptionex){
ex.printStackTrace();
}
}
}
}
}
●ChatServerMIDlet.java文件//优化之前文件
importjava.io.DataInputStream;
importjava.io.DataOutputStream;
importjavax.microedition.io.Connector;
importjavax.microedition.io.ServerSocketConnection;
importjavax.microedition.io.SocketConnection;
importjavax.microedition.lcdui.Command;
importjavax.microedition.lcdui.CommandListener;
importjavax.microedition.lcdui.Display;
importjavax.microedition.lcdui.Displayable;
importjavax.microedition.lcdui.Form;
importjavax.microedition.lcdui.TextField;
importjavax.microedition.midlet.MIDlet;
importjavax.microedition.midlet.MIDletStateChangeException;
publicclassChatServerMIDletextendsMIDletimplementsCommandListener{
privateServerSocketConnectionssc=null;
privateSocketConnectionsc=null;
//*********⑤
privateCommandcmdSend=newCommand("发送",Command.SCREEN,1);
privateFormfrmChat=newForm("聊天界面");
privateTextFieldtfMsg=newTextField("输入聊天信息","",255,TextField.ANY);
privateDisplaydisplay;
protectedvoiddestroyApp(booleanarg0)throwsMIDletStateChangeException{}
protectedvoidpauseApp(){}
protectedvoidstartApp()throwsMIDletStateChangeException{
display=Display.getDisplay(this);
display.setCurrent(frmChat);
frmChat.addCommand(cmdSend);
frmChat.append(tfMsg);
frmChat.setCommandListener(this);
try{
ssc=(ServerSocketConnection)Connector.open("socket:
//:
9999");
sc=(SocketConnection)ssc.acceptAndOpen();
//*********⑥
newReceiveThread().start();
}catch(Exceptionex){
ex.printStackTrace();
}
}
publicvoidcommandAction(Commandc,Displayabled){
if(c==cmdSend){
try{
DataOutputStreamdos=sc.openDataOutputStream();//*********⑦
dos.writeUTF(tfMsg.getString());
}catch(Exceptionex){
//ex.printStackTrace();
}
}
}
classReceiveThreadextendsThread{
publicvoidrun(){
while(true){
try{
DataInputStreamdis=sc.openDataInputStream();//*********⑧
Stringmsg=dis.readUTF();
frmChat.append(msg+"\n");
}catch(Exceptionex){
ex.printStackTrace();
}
}
}
}
}
优化方式:
删除③④⑦⑧处代码
在①⑤处添加代码:
privateDataInputStreamdis=null;privateDataOutputStreamdos=null;
在②⑥处添加代码:
dis=sc.openDataInputStream();dos=sc.openDataOutputStream();
聊天室程序
1.ChatServerMIDlet
importjava.io.*;
importjavax.microedition.io.*;
importjavax.microedition.lcdui.*;
importjavax.microedition.midlet.*;
publicclassChatServerMIDletextendsMIDletimplementsCommandListener{
privateServerSocketConnectionssc=null;
privateSocketConnectionsc=null;
privateDataInputStreamdis=null;
privateDataOutputStreamdos=null;
privatebooleanrun=true;
privateTextFieldtfMsg=newTextField("输入聊天信息","",255,TextField.ANY);
privateCommandcmdSend=newCommand("发送",Command.SCREEN,1);
privateFormfrmChat=newForm("聊天界面");
privateDisplaydisplay;
protectedvoidstartApp()throwsMIDletStateChangeException{
display=Display.getDisplay(this);
display.setCurrent(frmChat);
frmChat.addCommand(cmdSend);
frmChat.append(tfMsg);
frmChat.setCommandListener(this);
try{
ssc=(ServerSocketConnection)Connector.open("socket:
//:
9999");
sc=(SocketConnection)ssc.acceptAndOpen();
dis=sc.openDataInputStream();
dos=sc.openDataOutputStream();
newReceiveThread().start();
}catch(Exceptionex){
ex.printStackTrace();
}
}
publicvoidcommandAction(Commandc,Displayabled){
if(c==cmdSend){
try{
dos.writeUTF(tfMsg.getString());
}catch(Exceptionex){}
}
}
classReceiveThreadextendsThread{
publicvoidrun(){
while(run){
try{
Stringmsg=dis.readUTF();
frmChat.append(msg+"\n");
}catch(Exceptionex){ex.printStackTrace();}
}
close();
}
}
publicvoidclose(){
try{
dos.close();
dis.close();
sc.close();
ssc.close();
}catch(Exceptionex){}
}
}
ChatClientMIDlet
…………
importexample1.ChatServerMIDlet.ReceiveThread;
publicclassChatClientMIDletextendsMIDletimplementsCommandListener{
privateSocketConnectionsc=null;
privateDataInputStreamdis=null;
privateDataOutputStreamdos=null;
privateTextFieldtfMsg=newTextField("输入聊天信息","",255,TextField.ANY);
privateCommandcmdSend=newCommand("发送",Command.SCREEN,1);
privateFormfrmChat=newForm("聊天界面");
privateDisplaydisplay;
protecte