文档库 最新最全的文档下载
当前位置:文档库 › 实验二 网络基础编程实验

实验二 网络基础编程实验

实验二  网络基础编程实验
实验二  网络基础编程实验

《计算机网络》实验报告

信息安全

2015年4月1日

实验二网络基础编程实验

一、实验目的

通过本实验,学习采用Socket(套接字)设计简单的网络数据收发程序,理解应用数据包是如何通过传输层进行传送的。

二、实验内容

2.1、编写TCP进行数据发送的简单程序(java)

T C P C l i e n t.j a v a T C P S e r v e r.j a v a

2.2、编写UDP进行数据发送的简单程序(java)

UDPServer.java UDPClient.java

2.3多线程\线程池对比

TCPEchoClient.java

TCPEchoServer.java TCPEchoServerThread.java TCPEchoServerPool.java

2.4写一个简单的chat程序,编程语言不限。

三、实验程序

(1)TCP客户端TcpClient.java

import java.io.*;

import https://www.wendangku.net/doc/d09478232.html,.*;

public class TcpClient{

public static void main(String argv[]) throws Exception {

String sentence;//定义客户消息

String modifiedSentence;//定义服务器消息

InetAddress address = InetAddress.getLocalHost();//获取本机端口

BufferedReader inFromUser = new BufferedReader( new InputStreamReader(Syst em.in)); //创建客户输入流

//创建一个Scoket实例:构造函数向指定的远程主机和端口建立一个TCP连接。add ress.getHostName()为本机IP地址;6789为TCP服务器端口

Socket clientSocket = new Socket(address.getHostName(),6789); //客户套接字 //通过套接字的输入输出流(I/O streams)进行通信

DataOutputStream outToServer = new DataOutputStream( clientSocket.getOutput Stream()); //创建客户端到服务器的输出流

BufferedReader inFromServer = new BufferedReader( new InputStreamReader(cli entSocket.getInputStream())); //创建服务端输入流

sentence = inFromUser.readLine();//客户端读取客户输入消息

outToServer.writeBytes(sentence+'\n'); //客户端发送消息到服务器端

modifiedSentence =inFromServer.readLine();//客户端接收来自服务器的消息

System.out.println("client receive from TCP server:" + modifiedSentence);/ /客户端显示服务器发送过来的消息

clientSocket.close(); //客户端关闭套接字

}

}

(2)TCP服务器端TcpServer.java

import java.io.*;

import https://www.wendangku.net/doc/d09478232.html,.*;

public class TcpServer {

public static void main(String argV[]) throws Exception {

String clientSentence;//定义接收的消息

String capitalizedSentence;//定义发送的消息

ServerSocket welcomeSocket= new ServerSocket(6789);

//创建一个ServerSocket实例,并指定本地端口,侦听该指定端口收到的连接

while(true){

Socket connectionSocket = welcomeSocket.accept();

//调用ServerSocket的accept()方法以获取下一个客户端连接,基于新建立的客户端连接,创建一个Socket实例,并由accept()方法返回。

BufferedReader inFromClient = new BufferedReader( new InputStreamReade r(connectionSocket.getInputStream()));//创建客户端输入流

DataOutputStream outToClient = new DataOutputStream(connectionSocket.g etOutputStream());//创建服务器输出流

//使用所返回的Socket实例的InputStream和OutputStream与客户端进行通信。

clientSentence = inFromClient.readLine(); //接收客户发送的信息 capitalizedSentence = clientSentence.toUpperCase()+'\n'; //转换接收到的信息,小写变大写

outToClient.writeBytes("TCP accept "+capitalizedSentence);//输出给客户端

}

}

}

(3)UDP通信服务器端 UDPServer.java

import java.io.*;

import https://www.wendangku.net/doc/d09478232.html,.*;

public class UDPServer {

public static void main(String argV[]) throws Exception {

DatagramSocket serverSocket = new DatagramSocket (9876); //构造数据包套接字并将其绑定到主机上的端口9876

byte[] receiveData = new byte[1024]; //服务器从客户端接收到的信息

byte[] sendData = new byte[1024]; //服务器发送给客户端的信息

while(true){

DatagramPacket receivePacket = new DatagramPacket(receiveData,receiveD ata.length); //创建从客户端数据包

serverSocket.receive(receivePacket); //服务器从客户端接收数据包

String sentence = new String(receivePacket.getData()); //服务器接打开数据包得到消息

InetAddress IPAddress = receivePacket.getAddress();//获取客户端的IP地址

int port = receivePacket.getPort();//获取客户端端口

String capitalizedSentence = sentence.toUpperCase();//将接收的信息转为大写

sendData = capitalizedSentence.getBytes(); //转换后的消息

//服务器发送给客户端的数据包,将转换后的消息打包

DatagramPacket sendPacket = new DatagramPacket(sendData,sendData.lengt h,IPAddress,port);

serverSocket.send(sendPacket);//服务器发送数据包给客户端 }

}

}

(4)UDP通信客户端 UDPClient.java

import java.io.*;

import https://www.wendangku.net/doc/d09478232.html,.*;

public class UDPClient{

public static void main(String argv[]) throws Exception {

byte[] receiveData = new byte[1024]; //客户端接收的消息

byte[] sendData = new byte[1024]; //客户端发送的消息

BufferedReader inFromReader = new BufferedReader( new InputStreamReader(Sy stem.in));//客户输入流

DatagramSocket clientSocket = new DatagramSocket (); //客户端数据包套接字 InetAddress IPAddress = InetAddress.getLocalHost(); //获取本机IP地址

String sentence = inFromReader.readLine(); //客户端读取用户所输入的消息 sendData = sentence.getBytes(); //复制到要发送的消息

//客户端发送的数据包,这里将客户端要发送的消息,客户端的IP地址,端口打包 DatagramPacket sendPacket = new DatagramPacket(sendData,sendData.length,IP Address,9876);

clientSocket.send(sendPacket);//客户端套接字发送数据包

//客户端接收的数据包,数据包包含从服务器接收的消息,消息长度

DatagramPacket receivePacket = new DatagramPacket(receiveData,receiveData. length);

clientSocket.receive(receivePacket); //客户端接收数据包

String modifiedSentence = new String(receivePacket.getData()); //将接收的数据包解开

System.out.println("client receive from UDP server: " + modifiedSentence + " from from the client!"); //客户端显示数据包里的消息

clientSocket.close(); //关闭套接字

}}

(5)通过TCP协议与回馈服务器(echo server)进行通信的客户端TCPEchoClient.java import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import https://www.wendangku.net/doc/d09478232.html,.ServerSocket;

import https://www.wendangku.net/doc/d09478232.html,.Socket;

import https://www.wendangku.net/doc/d09478232.html,.SocketAddress;

public class TCPEchoServer{

private static final int BUFSIZE = 32;

public static void main(String[] args) throws IOException{

if (args.length != 1)//获取启动服务的端口

throw new IllegalArgumentException("Parameter(s): ");

int servPort = Integer.parseInt(args[0]);

//分配一个端口用于启动server端

ServerSocket servSock = new ServerSocket(servPort);

int recvMsgSize;

byte[] receiveBuf = new byte[BUFSIZE];

while (true){

Socket clntSock = servSock.accept(); //接收客户端的主动连接

SocketAddress clientAddress = clntSock.getRemoteSocketAddress();

System.out.println("Handling client at " + clientAddress);

InputStream in = clntSock.getInputStream();

OutputStream out = clntSock.getOutputStream();

while ((recvMsgSize = in.read(receiveBuf)) != -1)

out.write(receiveBuf, 0, recvMsgSize);

clntSock.close();

}}}

(6)为前面的客户端程序实现回馈服务器TCPEchoServer.java

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import https://www.wendangku.net/doc/d09478232.html,.Socket;

import https://www.wendangku.net/doc/d09478232.html,.SocketException;

public class TCPEchoClient{

public static void main(String[] args) throws IOException{

if ((args.length < 2) || (args.length > 3)) // 传入的数据在2~3之间,0:地址 1:传输字符 <2:端口>

throw new IllegalArgumentException("Parameter(s): []");

String server = args[0]; // ip地址或主机名称

byte[] data = args[1].getBytes();

int servPort = (args.length == 3) ? Integer.parseInt(args[2]) : 7; //默认端口为7

Socket socket = new Socket(server, servPort);

System.out.println("Connected to server...sending echo string");

InputStream in = socket.getInputStream();

OutputStream out = socket.getOutputStream();

out.write(data);

int totalBytesRcvd = 0;

int bytesRcvd;

while (totalBytesRcvd < data.length) {

if ((bytesRcvd = in.read(data, totalBytesRcvd,data.length - totalB ytesRcvd)) == -1)

throw new SocketException("Connection closed prematurely");

totalBytesRcvd += bytesRcvd;

}

System.out.println("Received: " + new String(data));

socket.close();

}}

(7)一客户一线程

//二、每个客户端请求都新启一个线程的Tcp服务端:import java.io.IOException; import https://www.wendangku.net/doc/d09478232.html,.ServerSocket;

import https://www.wendangku.net/doc/d09478232.html,.Socket;

import java.util.logging.Logger;

public class TCPEchoServerThread {

public static void main(String[] args) throws Exception {//IOException

ServerSocket servSock = new ServerSocket(5500);

Logger logger = Logger.getLogger("practical");

while (true) {

Socket clntSock = servSock.accept(); // Block waiting for connectio Thread thread = new Thread(new EchoProtocol(clntSock, logger));

thread.start();

https://www.wendangku.net/doc/d09478232.html,("Created and started Thread " + thread.getName()); }}}

(8)线程池

//三、固定线程数的Tcp服务端

import java.io.IOException;

import https://www.wendangku.net/doc/d09478232.html,.ServerSocket;

import https://www.wendangku.net/doc/d09478232.html,.Socket;

import java.util.logging.Level;

import java.util.logging.Logger;

public class TCPEchoServerPool {

public static void main(String[] args) throws IOException {

int threadPoolSize = 3; // Fixed ThreadPoolSize

final ServerSocket servSock = new ServerSocket(5500);

final Logger logger = Logger.getLogger("practical");

for (int i = 0; i < threadPoolSize; i++) {

Thread thread = new Thread() {

public void run() {

while (true) {

try {

Socket clntSock = servSock.accept(); //等待连接 EchoProtocol.handleEchoClient(clntSock, logger); // 等待 } catch (IOException ex) {

logger.log(Level.WARNING, "Client accept failed", e x);

}}}};

thread.start();

https://www.wendangku.net/doc/d09478232.html,("Created and started Thread = " + thread.getName()); }}}

(9)聊天程序服务器端 NetChatServerDlg.cpp

#include "stdafx.h"

#include "NetChatServer.h"

#include "NetChatServerDlg.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

CNetChatServerDlg::CNetChatServerDlg(CWnd* pParent /*=NULL*/)

: CDialog(CNetChatServerDlg::IDD, pParent)

{

m_serverPort = 1130;

m_serverSocket = INVALID_SOCKET;

m_clientSocket = INVALID_SOCKET;

memset(&m_clientAddr, 0, sizeof(m_clientAddr));

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

void CNetChatServerDlg::DoDataExchange(CDataExchange* pDX){

//{{AFX_DATA_MAP(CNetChatServerDlg)

DDX_Control(pDX, IDC_PORT, m_portCtrl);

DDX_Control(pDX, IDC_EDIT_MSG, m_editMsg);

DDX_Control(pDX, IDC_SHOW_MSG, m_showMsg);

DDX_Text(pDX, IDC_PORT, m_serverPort);

}

BEGIN_MESSAGE_MAP(CNetChatServerDlg, CDialog)

//{{AFX_MSG_MAP(CNetChatServerDlg)

ON_MESSAGE(WM_SOCKET,OnSocket)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_BN_CLICKED(IDC_START_SERVER, OnStartServer)

ON_BN_CLICKED(IDC_SEND_MSG, OnSendMsg)

ON_EN_MAXTEXT(IDC_SHOW_MSG, OnMaxtextShowMsg)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

BOOL CNetChatServerDlg::OnInitDialog(){

CDialog::OnInitDialog();

SetIcon(m_hIcon, TRUE); // Set big icon

SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here

CtrlState(FALSE);

m_portCtrl.SetLimitText(5);//65535

return TRUE; // return TRUE unless you set the focus to a control }

void CNetChatServerDlg::OnSysCommand(UINT nID, LPARAM lParam){ if((nID & 0xFFF0) == SC_CLOSE && m_serverSocket != INVALID_SOCKET) OnStartServer();

CDialog::OnSysCommand(nID, lParam);

}

void CNetChatServerDlg::OnPaint() {

if (IsIconic()){

CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

int cxIcon = GetSystemMetrics(SM_CXICON);

int cyIcon = GetSystemMetrics(SM_CYICON);

CRect rect;

GetClientRect(&rect);

int x = (rect.Width() - cxIcon + 1) / 2;

int y = (rect.Height() - cyIcon + 1) / 2;

dc.DrawIcon(x, y, m_hIcon);

}

else

CDialog::OnPaint();

}

HCURSOR CNetChatServerDlg::OnQueryDragIcon(){

return (HCURSOR) m_hIcon;

}

BOOL CNetChatServerDlg::PreTranslateMessage(MSG* pMsg) {

return CDialog::PreTranslateMessage(pMsg);

}

void CNetChatServerDlg::CtrlState(BOOL state){

m_editMsg.EnableWindow(state);

GetDlgItem(IDC_SEND_MSG)->EnableWindow(state);

}

void CNetChatServerDlg::OnStartServer() {

CString msg;

m_showMsg.GetWindowText(msg);

if(m_serverSocket != INVALID_SOCKET)//已经启动服务器,则停止服务器{ if(m_clientSocket != INVALID_SOCKET)

::closesocket(m_clientSocket);

::closesocket(m_serverSocket);

::WSACleanup();

CtrlState(FALSE);

GetDlgItem(IDC_START_SERVER)->SetWindowText("启动服务器");

m_portCtrl.EnableWindow(TRUE);

m_serverSocket = INVALID_SOCKET;

m_clientSocket = INVALID_SOCKET;

msg += "\r\n服务器已停止!";

}

else//启动服务器{

UpdateData(TRUE);

if(m_serverPort > 65535){

AfxMessageBox("服务器端口溢出!请重新设定!");

return;

}

WSADATA data;

if(::WSAStartup(MAKEWORD(2, 2), &data)){

AfxMessageBox("启动套接字失败!");

return;

}

sockaddr_in addr;

addr.sin_family = AF_INET;

addr.sin_port = htons(m_serverPort);

addr.sin_addr.S_un.S_addr = INADDR_ANY;

m_serverSocket = ::socket(AF_INET,SOCK_STREAM,0);

if(INVALID_SOCKET == m_serverSocket ||

::bind(m_serverSocket, (sockaddr*)&addr, sizeof(addr)) == SOCKET_ER ROR ||

::listen(m_serverSocket, 1) == SOCKET_ERROR ||

::WSAAsyncSelect(m_serverSocket, this->m_hWnd, WM_SOCKET, FD_ACCEPT |FD_READ|FD_CLOSE) == SOCKET_ERROR){

AfxMessageBox("创建服务器失败!");

::WSACleanup();

m_serverSocket = INVALID_SOCKET;

return;

}

m_portCtrl.EnableWindow(FALSE);

GetDlgItem(IDC_START_SERVER)->SetWindowText("停止服务器");

msg += "\r\n服务器已启动";

}

m_showMsg.SetWindowText(msg);

m_showMsg.LineScroll(m_showMsg.GetLineCount());

}

void CNetChatServerDlg::OnSendMsg() {

if(m_clientSocket != INVALID_SOCKET){

char send[500] = {0};

m_editMsg.GetWindowText(send, sizeof(send) - 1);

int strlength = strlen(send);

if(strlength < 1){

MessageBox("发送内容不能为空!");

return;

}

CString msg;

m_showMsg.GetWindowText(msg);

if(::send(m_clientSocket, send, strlength, 0) != SOCKET_ERROR){ msg += "\r\n本机:\r\n";

msg += send;

}

else

msg += "\r\n本机: 消息发送失败!";

m_showMsg.SetWindowText(msg);

m_showMsg.LineScroll(m_showMsg.GetLineCount());

}

}

void CNetChatServerDlg::OnSocket(WPARAM wParam,LPARAM lParam){

switch (lParam){

case FD_ACCEPT:{

int lenth = sizeof(m_clientAddr);

if(m_clientSocket != INVALID_SOCKET){

sockaddr_in addr;

lenth = sizeof(addr);

SOCKET s = ::accept(m_serverSocket, (sockaddr *)&addr, &lenth);

::closesocket(s);

break;

}

m_clientSocket = ::accept(m_serverSocket, (sockaddr *)&m_clientAddr, &lenth);

if(INVALID_SOCKET != m_clientSocket){

CString msg;

m_showMsg.GetWindowText(msg);

msg += "\r\n有客户端连接:";

msg += ::inet_ntoa(m_clientAddr.sin_addr);

CtrlState(TRUE);

m_showMsg.SetWindowText(msg);

m_showMsg.LineScroll(m_showMsg.GetLineCount());

}

}

break;

case FD_READ:{

char get[500] = {0};

::recv(m_clientSocket, get, sizeof(get) - 1, 0);

CString msg;

m_showMsg.GetWindowText(msg);

msg += "\r\n";

msg += ::inet_ntoa(m_clientAddr.sin_addr);

msg += ":\r\n";

msg += get;

m_showMsg.SetWindowText(msg);

m_showMsg.LineScroll(m_showMsg.GetLineCount());

}

break;

case FD_CLOSE:{

m_clientSocket = INVALID_SOCKET;

CString msg;

m_showMsg.GetWindowText(msg);

msg += "\r\n客户端断开:";

CtrlState(FALSE);

m_showMsg.SetWindowText(msg);

m_showMsg.LineScroll(m_showMsg.GetLineCount());

}

break;

}

}

void CNetChatServerDlg::OnMaxtextShowMsg() {

m_showMsg.SetWindowText("消息,自动清理!");

}

(10)聊天程序客户端 NetChatClientDlg.cpp

#include "stdafx.h"

#include "NetChatClient.h"

#include "NetChatClientDlg.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

// CNetChatClientDlg dialog

CNetChatClientDlg::CNetChatClientDlg(CWnd* pParent /*=NULL*/) : CDialog(CNetChatClientDlg::IDD, pParent)

{

//{{AFX_DATA_INIT(CNetChatClientDlg)

m_port = 1130;

//}}AFX_DATA_INIT

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

m_clientSocket = INVALID_SOCKET;

}

void CNetChatClientDlg::DoDataExchange(CDataExchange* pDX){ CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CNetChatClientDlg)

DDX_Control(pDX, IDC_SHOW_MSG, m_showMsg);

DDX_Control(pDX, IDC_EDIT_MSG, m_editMsg);

DDX_Control(pDX, IDC_IPADDR, m_ipAddr);

DDX_Control(pDX, IDC_PORT, m_portCtrl);

DDX_Text(pDX, IDC_PORT, m_port);

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CNetChatClientDlg, CDialog)

//{{AFX_MSG_MAP(CNetChatClientDlg)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_BN_CLICKED(IDC_SEND, OnSend)

ON_BN_CLICKED(IDC_CONNECT, OnConnect)

ON_WM_TIMER()

ON_MESSAGE(WM_SOCKET,OnSocket)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

BOOL CNetChatClientDlg::OnInitDialog(){

CDialog::OnInitDialog();

SetIcon(m_hIcon, TRUE); // Set big icon

SetIcon(m_hIcon, FALSE); // Set small icon

m_ipAddr.SetWindowText("192.168.1.104");

CtrlState(TRUE);

return TRUE; // return TRUE unless you set the focus to a control }

void CNetChatClientDlg::OnSysCommand(UINT nID, LPARAM lParam){ if ((nID & 0xFFF0) == SC_CLOSE && m_clientSocket != INVALID_SOCKET) OnConnect();

CDialog::OnSysCommand(nID, lParam);

}

void CNetChatClientDlg::OnPaint(){

if (IsIconic()){

CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

int cxIcon = GetSystemMetrics(SM_CXICON);

int cyIcon = GetSystemMetrics(SM_CYICON);

CRect rect;

GetClientRect(&rect);

int x = (rect.Width() - cxIcon + 1) / 2;

int y = (rect.Height() - cyIcon + 1) / 2;

dc.DrawIcon(x, y, m_hIcon);

}

else

CDialog::OnPaint();

}

HCURSOR CNetChatClientDlg::OnQueryDragIcon(){

return (HCURSOR) m_hIcon;

}

BOOL CNetChatClientDlg::PreTranslateMessage(MSG* pMsg) {

return CDialog::PreTranslateMessage(pMsg);

}

void CNetChatClientDlg::OnSend() {

if(m_clientSocket != INVALID_SOCKET){

char send[500] = {0};

m_editMsg.GetWindowText(send, sizeof(send) - 1);

int strlength = strlen(send);

if(strlength < 1){

MessageBox("发送内容不能为空!");

return;

}

CString msg;

m_showMsg.GetWindowText(msg);

if(::send(m_clientSocket, send, strlength, 0) != SOCKET_ERROR){ msg += "\r\n本机: \r\n";

msg += send;

}

else

msg += "\r\n本机: 消息发送失败!";

m_showMsg.SetWindowText(msg);

m_showMsg.LineScroll(m_showMsg.GetLineCount());

}

}

void CNetChatClientDlg::CtrlState(BOOL state){

m_portCtrl.EnableWindow(state);

m_ipAddr.EnableWindow(state);

SetDlgItemText(IDC_CONNECT, state == TRUE ? "连接" : "断开");

GetDlgItem(IDC_SEND)->EnableWindow(!state);

m_editMsg.EnableWindow(!state);

}

void CNetChatClientDlg::OnConnect() {

CString msg;

m_showMsg.GetWindowText(msg);

if(m_clientSocket != INVALID_SOCKET)//已经启动服务器,则停止服务器{ ::closesocket(m_clientSocket);

::WSACleanup();

CtrlState(TRUE);

m_clientSocket = INVALID_SOCKET;

msg += "\r\n已断开!";

}

else//启动服务器{

UpdateData(TRUE);

if(m_port > 65535){

AfxMessageBox("端口溢出!请重新设定!");

return;

}

WSADATA data;

if(::WSAStartup(MAKEWORD(2, 2), &data)){

AfxMessageBox("启动套接字失败!");

return;

}

sockaddr_in addr;

addr.sin_family = AF_INET;

addr.sin_port = htons(m_port);

m_ipAddr.GetAddress(addr.sin_addr.S_un.S_un_b.s_b1, addr.sin_addr.S_un. S_un_b.s_b2,

addr.sin_addr.S_un.S_un_b.s_b3, addr.sin_addr.S_un.S_un_b.s_b4);

m_clientSocket = ::socket(AF_INET, SOCK_STREAM, 0);

if(INVALID_SOCKET == m_clientSocket ||

::WSAAsyncSelect(m_clientSocket, this->m_hWnd, WM_SOCKET, FD_CONNEC T|FD_READ|FD_CLOSE) == SOCKET_ERROR){

AfxMessageBox("连接失败!");

::WSACleanup();

m_clientSocket = INVALID_SOCKET;

return;

}

::connect(m_clientSocket, (sockaddr*)&addr, sizeof(addr));

SetTimer(1, 4000, NULL);

msg += "\r\n正在连接...";

}

m_showMsg.SetWindowText(msg);

m_showMsg.LineScroll(m_showMsg.GetLineCount());

}

void CNetChatClientDlg::OnSocket(WPARAM wParam,LPARAM lParam){ switch (lParam){

case FD_CONNECT:{

KillTimer(1);

CtrlState(FALSE);

CString msg;

m_showMsg.GetWindowText(msg);

msg += "\r\n连接成功!";

m_showMsg.SetWindowText(msg);

m_showMsg.LineScroll(m_showMsg.GetLineCount());

}

break;

case FD_READ:{

char get[500] = {0};

::recv(m_clientSocket, get, sizeof(get) - 1, 0);

CString msg;

m_showMsg.GetWindowText(msg);

msg += "\r\n对方:";

msg += get;

m_showMsg.SetWindowText(msg);

m_showMsg.LineScroll(m_showMsg.GetLineCount());

}

break;

case FD_CLOSE:{

CtrlState(TRUE);

CString msg;

m_showMsg.GetWindowText(msg);

msg += "\r\n连接断开!";

m_showMsg.SetWindowText(msg);

m_showMsg.LineScroll(m_showMsg.GetLineCount());

m_clientSocket = INVALID_SOCKET;

}

break;

}

}

void CNetChatClientDlg::OnTimer(UINT nIDEvent){

// TODO: Add your message handler code here and/or call default if(nIDEvent == 1){

KillTimer(1);

MessageBox("连接服务器失败!");

::WSACleanup();

m_clientSocket = INVALID_SOCKET;

}

CDialog::OnTimer(nIDEvent);

}

四、程序流程图

(1)TCPClient.java TCPServer.java

(2)UDPClient.java UDPSever.java

(3)TCP多线程跟(1)相似

(4)聊天程序

A.客户端窗口

B.服务器端窗口

C.聊天程序流程图

五、实验步骤

编写程序->测试->分析结果

(1) TCP测试流程(2) UDP测试流程

(3)TCP多线程同(1)相似(4)聊天程序测试流程

六、实验结果

(1)TCP

相关文档