实验一 Socket 编程
班级:电子商务 08-2 班
学号:20085154
姓名:杨阳
一、目的
通过 socket 程序的编写、调试,掌握 socket 编程的基本方法,促进学生对
概念的理解,培养动手能力。
二、基本要求
编写并调试教学中使用的 socket 程序示例,并加以修改,增加程序的功能。
完成实验后,需要按时提交实验报告。
三、实验内容
服务器端程序代码:
import java.io.*;
import java.net.*;
public class Socketserver
{
public static void main(String args[])
{
Socket soc=null;
InputStream is=null;
OutputStream os=null;
ServerSocket servSocket=null;
try{
servSocket=new ServerSocket(8000);// 调用 ServerSocket 类的构造方法,
以 8000 端口号为参数,创建一个 ServerSocket 对象
soc=servSocket.accept();//服务程序使用 ServerSocket 对象的 accept( )方法
接收来自客户程序的请求。直到接收到从客户程序发来的连接请求(否则一直等
待),然后该方法返回一个新建的 Socket 类的对象
is=soc.getInputStream();//返回对 socket 的输入流的引用
os=soc.getOutputStream();//返回对 socket 的输出流的引用
BufferedReader in=new BufferedReader(new InputStreamReader(is));//
通过 InputStreamReader 的对象 is 的读取,将值赋给 in,基于字符流
PrintWriter
out=new
BufferedWriter(new
OutputStreamWriter(os)),true);//通过 BufferedWriter 方法封装了 os,将值赋给 out,
其方法取参数 ture 表示当读取数据时,即自动刷新缓存区,当该参数取 flash 时,
PrintWriter(new
只有当缓存区满时,才会刷新缓存区
System.out.println("client'sIP:"+soc.getInetAddress());//getInetAddress()
方法可以获得客户机的 IP 地址; System.out.println()表示向本地计算机反映相关
信息
得端口号
System.out.println("client's port"+soc.getPort());//getPort() 方 法 可 以 获
out.println("welcome!");//该方法表示向客户端输出相关数据
String s=in.readLine();//读取一行数据
while(!s.equalsIgnoreCase("quit"))//当客户端的数据不为 quit 时
{
System.out.println("client said:"+s);
s=in.readLine();
}
System.out.println("client wants to leave.");
}catch(Exception e)
{
System.err.println("socket wrong connetion");//输出错误信息
e.printStackTrace();//出现异常时,打印整个方法调用名单
}finally{//finally 方法释放资源
try
{
is.close();//关闭输入流
os.close();//关闭输出流
soc.close();//关闭 Socket
servSocket.close();//关闭 ServerSocker
System.out.println("over,successfully leasing resouce");
}catch(Exception e)
{
System.err.println("close socket wrong");//输出错误信息
e.printStackTrace();//出现异常时,打印整个方法调用名单
}
}
}
}
客户端程序代码:
import java.io.*;
import java.net.*;
public class Socketclient
{
public static void main(String args[])
{
Socket soc=null;
InputStream is=null;
OutputStream os=null;
try
{
soc=new Socket("localhost",8000);
System.out.println("connecting to the server");
is=soc.getInputStream();
os=soc.getOutputStream();
BufferedReader
in=new
BufferedReader(new
InputStreamReader(is));
PrintWriter
out=new
PrintWriter(new
BufferedWriter(new
OutputStreamWriter(os)),true);
String s=in.readLine();
System.out.println("server said:"+s);
System.out.println("server's IP:"+soc.getInetAddress());
System.out.println("server's Port"+soc.getPort());
/*byte b[]=new byte[100];
System.in.read(b);
String ms=new String(b);*/
BufferedReader
in2=new
BufferedReader(new
InputStreamReader(System.in));//定义变量 in2 获取服务器端信息
String ms=in2.readLine();//定义变量 ms 获取信息
ms=ms.trim();
while(!ms.equalsIgnoreCase("quit"))
{
out.println(ms);
ms=in2.readLine();
ms=ms.trim();
}
out.println(ms);
}catch(Exception e)
{
System.err.println("socket error");
e.printStackTrace();
}finally{
try
{
is.close();
os.close();
soc.close();
System.out.println("over,leasing resource successfully");
}catch(Exception e)
{
System.err.println("close socket wrong");
e.printStackTrace();
}
}
}
}
服务器端程序的编写
1 调用 ServerSocket 类的构造方法,以某端口号为参数,创建一个 ServerSocket
对象。
2 服务程序使用 ServerSocket 对象的 accept( )方法接收来自客户程序的请求。
3 获取输入输出流对象,使服务器能够通过输入输出流与客户机交互。
4 使用 I/O 处理的方法完成和客户方的数据传输,处理客户方的数据,并将
结果返回给客户方。
5 客户方工作完毕,服务程序通过调用流和 socket 的 close( )方法关闭流和连
接。
客户端程序的编写
1 创建一个 Socket,实现与服务器的连接。
2 客户使用 Socket 类提供的方法 getInputStream( )和 getOutputStream( )获得对
输入输出流的引用。
3 处理阶段,通过获得的输入输出流对象进行通信。
4 调用流和 Socket 的 close( )方法关闭流和连接。
四、实验中遇到的问题和解决方案
1、变量名取错了
2、/*byte b[]=new byte[100];
System.in.read(b);
String ms=new String(b);*/
3、程序运行顺序
Socket 编程基础
在网络编程时,需要产生一个 socket 来建立与另一台机器的连接。然后就
可以从 socket 获得 InputStream 和 OutputStream 对象,这样就能够用输入
输出流对象来进行数据处理。
一个连线对应于两个 socket 对象。
有两种 socket 类:ServerSocket 用来让服务器监听连线;Socket 用来让客
户端建立连线。
当客户端建立连线后,ServerSocket 就会通过 accept( )方法返回对应的
Socket,通过返回的 Socket 就可以开始通信。这样便有一条 socket 对 socket
的连线。可以使用 getInputSream( )和 getOutputStream( )方法从两个 socket
获得相应的 InputStream 和 OutputStream 对象,然后可以对其进行处理,
就象通常的文件处理一样。
ServerSocket 的主要作用是等待客户机连接上来,然后返回一个 Socket。
生成 ServerSocket 对象时只需指定 port,因为它已经位于运行服务程序的
机器上了。在产生 Socket 对象时,必须同时指定 IP 地址和 port(服务程
序所对应的端口号)。
(2)根据所要实现的功能,编写 socket 服务器端程序、客户端程序;要清
楚服务器端和客户端之间如何建立连接、任何传输数据。
(3)编译程序,修改 JDK 或 IDE 提示的错误,直到编译时无错误出现。
(4)首先运行服务器端程序,等待客户机的连接;然后运行客户端程序,
实现服务器、客户机之间的通信。如运行程序时出错,根据提示的错误修改源程
序,直到能够正确运行。
五、设备或工具使用说明
软件要求:Windows 操作系统,JDK 1.4 或以上版本,JCREATOR 或记事本
编辑器。
软件具体用法参见课堂教学。
六、注意事项
要注意服务器端程序、客户端程序的运行先后次序,不能颠倒。另外上机调
试程序时需要记录遇到的问题及解决方法,以作为书写报告的素材。
七、思考题
如何实现实现服务器、客户机之间的交互?也就是说服务器、客户机不光可
以接受对方的数据,还可以根据对方发送来的数据给予回复。