导航:首页 > 编程语言 > tcp套接字编程实例

tcp套接字编程实例

发布时间:2022-08-22 08:10:09

A. TCP服务器和客户机编程

服务器(TCP/IP)编程实例
现在大多数语言都支持客户-服务器模式(C/S)编程,其中VB给我们提供了很好的客户-服务器编程方式。下面我们用VB来实现TCP/IP网络编程。
TCP/IP协议是Internet最重要的协议。VB提供了WinSock控件,用于在TCP/IP的基础上进行网络通信。当两个应用程序使用Socket进行网络通信时,其中一个必须创建Socket服务器侦听,而另一个必须创建Socket客户去连接服务器。这样两个程序就可以进行通信了。
①创建服务器
首先创建一个服务端口号。并开始侦听是否有客户请求连接。
建立一窗体,并向其增加一个Winsock控件(可在工程菜单中的部件项来添加此控件)
添加两文本框Text1,Text2,和一按钮Command1
Private Sub Form_Load()
SockServer.LocalPort = 2000 ′服务器端口号,最好大于1000
SockServer.Listen ′开始侦听
End Sub
Private Sub Form_Unload(Cancel As Integer)
SockServer.Close
End Sub
Private Sub SockServer_Close()
SockServer.Close
End Sub
Private Sub SockServer_ConnectionRequest(ByVal requestID As Long)
SockServer.Close
SockServer.Accept requestID ′表示客户请求连接的ID号
End Sub
′当客户向服务器发送数据到达后,产生DataArrival事件,在事件中接收数据,GetData方法接收数据。
Private Sub SockServer_Data
Arrival(ByVal bytesTotal As Long)
Dim s As String
SockServer.GetData s
Text1.Text = s
End Sub
当需要向客户发送数据时,只需调用SendData方法。
Private Sub Command1_Click()
SockServer .SendData Text2.Text
End Sub
②创建客户
要创建客户连接服务器,首先设置服务器主机名,如IP地址、域名或计算机名,然后设置服务器端口,最后连接服务器。
建立一窗体,并向其增加一个Winsock控件(可在工程菜单中的部件项来添加此控件),取名为:SockC1。添加两文本框Text1,Text2,和一按钮Command1
Private Sub Form_Load()
SockCl.RemoteHost =′127.0.0.1″
′表示服务器主机名
SockCl.RemotePort = 2000
′表示服务器端口名
SockCl.Connect
′连接到服务器
End Sub
Private Sub Form_Unload(Cancel As Integer)
SockCl.Close
End Sub
Private Sub SockCl_Close()
SockCl.Close
End Sub
Private Sub SockCl_DataArrival(ByVal bytesTotal As Long)
Dim s As String
SockCl.GetData s ′接收数据到文本框中
Text1.Text = s
End Sub
Private Sub Command1_Click()
SockCl.SendData Text2.Text ′向服务器发送数据
End Sub
③进行通信
把这两个窗体分别编译成两个EXE文件,服务器Server.exe和客户Client.exe程序,并把它们分别安装在服务器端和客户端,这样就可以实现两者通信了。
-

B. 如何启动一个TCP套接字连接和js写的东西吗

你可以创建两种类型的TCP套接字:1. 服务端,2. 客户端。服务端TCP监听来自客户端的连接请求,并使用TCP连接向客户端发送数据;客户端TCP连接到服务端并与服务器交互数据。客户端与服务端之间依靠套接字进行双向通信。
在NodeJS中使用TCP需要引用net模块。net模块是NodeJS中异步网络编程的封装,可以做很多事情,本文仅关注于如何使用该模块创建服务端与客户端的TCP套接字。
创建TCP服务端
下面是一个在NodeJS中创建TCP服务端套接字的简单例子,相关说明见代码注释。
var net = require('net');var HOST = '127.0.0.1';var PORT = 6969;// 创建一个TCP服务器实例,调用listen函数开始监听指定端口// 传入net.createServer()的回调函数将作为”connection“事件的处理函数// 在每一个“connection”事件中,该回调函数接收到的socket对象是唯一的net.createServer(function(sock) {

// 我们获得一个连接 - 该连接自动关联一个socket对象
console.log('CONNECTED: ' +
sock.remoteAddress + ':' + sock.remotePort);

// 为这个socket实例添加一个"data"事件处理函数
sock.on('data', function(data) {
console.log('DATA ' + sock.remoteAddress + ': ' + data);
// 回发该数据,客户端将收到来自服务端的数据
sock.write('You said "' + data + '"');
});

// 为这个socket实例添加一个"close"事件处理函数
sock.on('close', function(data) {
console.log('CLOSED: ' +
sock.remoteAddress + ' ' + sock.remotePort);
});}).listen(PORT, HOST);console.log('Server listening on ' + HOST +':'+ PORT);

服务端也可以用稍不同的方式接受TCP连接,即显式处理"connection"事件:
var server = net.createServer();server.listen(PORT, HOST);console.log('Server listening on ' +
server.address().address + ':' + server.address().port);server.on('connection', function(sock) {

console.log('CONNECTED: ' +
sock.remoteAddress +':'+ sock.remotePort);
// 其它内容与前例相同});

上述两个例子只是写法不同,并无本质区别。
创建TCP客户端
现在让我们创建一个TCP客户端连接到刚创建的服务器上,该客户端向服务器发送一串消息,并在得到服务器的反馈后关闭连接。下面的代码描述了这一过程。
var net = require('net');var HOST = '127.0.0.1';var PORT = 6969;var client = new net.Socket();client.connect(PORT, HOST, function() {

console.log('CONNECTED TO: ' + HOST + ':' + PORT);
// 建立连接后立即向服务器发送数据,服务器将收到这些数据
client.write('I am Chuck Norris!');});// 为客户端添加“data”事件处理函数// data是服务器发回的数据client.on('data', function(data) {

console.log('DATA: ' + data);
// 完全关闭连接
client.destroy();});// 为客户端添加“close”事件处理函数client.on('close', function() {
console.log('Connection closed');});

C. C#中TCP进行同步套接字编程,服务器和客户端的工作流程(需要代码和图)

代码来了,。。
服务器:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
using System.Reflection;
using System.Diagnostics;
using System.Text.RegularExpressions;

namespace msgServer
{
public partial class frmServer : Form
{
private Socket socket;
private IPAddress myIP;
private IPEndPoint endPoint;
private int point;
private Socket clientSocket;
private Assembly ass = null;
private System.IO.Stream stream = null;
private System.Media.SoundPlayer pl;
private string txt;
private byte[] bs = new byte[512];
public frmServer()
{
InitializeComponent();
ass = Assembly.GetExecutingAssembly();
stream = ass.GetManifestResourceStream("msgServer.msg.wav");
pl = new System.Media.SoundPlayer(stream);
}

//字体选择
private void btnFont_Click(object sender, EventArgs e)
{
FontDialog font = new FontDialog();
font.ShowEffects = true;
font.ShowColor = true;
font.MinSize = 12;
font.Font = new Font("楷体_GB2312", 18, FontStyle.Bold);
font.Color = Color.Blue;

if (font.ShowDialog() == DialogResult.OK)
{
rtxtSend.Font = font.Font;
rtxtSend.ForeColor = font.Color;
}

}

//开始监听
private void btnStart_Click(object sender, EventArgs e)
{
System.Threading.Thread th1 = new System.Threading.Thread(ToConnect);
th1.Start();
}

//去连接
private void ToConnect()
{
try
{
myIP = IPAddress.Parse(txtIP.Text.Trim());//IP
point = Convert.ToInt32(txtPoint.Text.Trim());//Point
endPoint = new IPEndPoint(myIP, point); //终端

socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Bind(endPoint);//绑定
socket.Listen(3); //最多3人同时连接

lblStatus.Text = "服务器已经运行...";

clientSocket = socket.Accept();//等待接受
//连接上时
if (clientSocket.Connected)
{
lblStatus.Text = "已经建立连接.";

while (true)
{
try
{
clientSocket.Receive(bs, bs.Length, 0);
pl.Play();
rtxtMsg.AppendText(System.Text.Encoding.Unicode.GetString(bs));
}
catch { lblStatus.Text = "连接已经断开."; }
}
}
}
catch { txtIP.Focus(); txtIP.SelectAll(); MessageBox.Show("IP error OR Point error"); }
}

//停止监听
private void btnStop_Click(object sender, EventArgs e)
{
try
{
socket.Close(3);
lblStatus.Text = "监听已经停止.";
}
catch
{
lblStatus.Text = "目前未建立连接.";
}
}

private void frmServer_KeyPress(object sender, KeyPressEventArgs e)
{

}

private void frmServer_KeyDown(object sender, KeyEventArgs e)
{
if ((e.Control && e.KeyCode == Keys.Enter) || (e.Alt && e.KeyCode == Keys.S))
{
btnSend.PerformClick();//单击发送
}
}

//发送消息
private void btnSend_Click(object sender, EventArgs e)
{
if (rtxtSend.Text.Trim() == "")
return;
else if (rtxtSend.Text.Trim().ToLower() == "clear()")
{
rtxtMsg.Clear();
rtxtSend.Text = "";
return;
}
else if (Regex.IsMatch(rtxtSend.Text.Trim().ToLower(), @"^[zoom(]+[\d]+[)]$"))
{
string str = rtxtSend.Text.ToLower();
int size = Convert.ToInt32(str.Substring(str.LastIndexOf('(') + 1,
str.IndexOf(')') - str.LastIndexOf('(') - 1));
rtxtMsg.Font = new Font("宋体", size,FontStyle.Bold);
return;
}
else if (Regex.IsMatch(rtxtSend.Text.Trim().ToLower(), @"^[down(]+[\d]+[)]$"))
{
string str = rtxtSend.Text.ToLower();
string size = str.Substring(str.LastIndexOf('(') + 1,str.IndexOf(')') - str.LastIndexOf('(') - 1);

if (Convert.ToInt32(size) > rtxtMsg.Text.Length)
return;

}
else if (Regex.IsMatch(rtxtSend.Text.Trim().ToLower(), @"^[up(]+[\d]+[)]$"))
{
string str = rtxtSend.Text.ToLower();
string size = str.Substring(str.LastIndexOf('(') + 1,str.IndexOf(')') - str.LastIndexOf('(') - 1);

}
else if (rtxtSend.Text.Trim().ToLower() == "exit(0)")
{
this.Close();
return;
}

try
{
byte[] bs = new byte[512];
string user = null;
if (txtUser.Text.Trim() == "在此输入你的名字" || txtUser.Text.Trim() == "")
{
user = "我";
bs = Encoding.Unicode.GetBytes(string.Format("对方说:({0})\r\n{1}\r\n",DateTime.Now.ToString(), rtxtSend.Text.Trim()));
}
else
{
bs = Encoding.Unicode.GetBytes(string.Format("{0}说:({1})\r\n{2}\r\n", txtUser.Text.Trim(),DateTime.Now.ToString(), rtxtSend.Text.Trim()));
user = txtUser.Text.Trim();
}
clientSocket.Send(bs, bs.Length, 0);//发送
txt = string.Format("{0}说:({1})\r\n{2}\r\n", user, DateTime.Now.ToString(),rtxtSend.Text.Trim());
int tempLen = rtxtMsg.Text.Length;
rtxtMsg.AppendText(txt);
rtxtMsg.Select(tempLen, txt.Length);
rtxtMsg.SelectionFont = new Font("宋体", 10);
rtxtMsg.SelectionColor = Color.Red;
rtxtSend.Clear();
}
catch { MessageBox.Show("未建立连接,无法发送数据!"); }
}

//关闭Socket
private void frmServer_FormClosing(object sender, FormClosingEventArgs e)
{
try
{
//关闭连接
socket.Close(3);
}
catch (Exception) { }
finally
{
foreach (Process p in Process.GetProcesses())
{
if (p.ProcessName == Application.ProctName)
p.Kill();
}
}
}

private void frmServer_Load(object sender, EventArgs e)
{
foreach (Process p in Process.GetProcesses())
{
if (p.ProcessName == Application.ProctName)//已经启动
{
if (p.Id != Process.GetCurrentProcess().Id)//不是当前进程
{
p.Kill();
}
}
}
}

private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
this.TopMost = checkBox1.Checked;
}
}
}

客户端:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Diagnostics;
using System.Text.RegularExpressions;

namespace smgClient
{
public partial class frmClient : Form
{
private IPAddress IP;//ip
private EndPoint endpoint;//point
private Socket socket;//socket
private System.IO.Stream stream = null;
private System.Reflection.Assembly ass = null;
private System.Media.SoundPlayer pl = null;
private string txt;
private byte[] bs = new byte[512];

public frmClient()
{
InitializeComponent();
ass = System.Reflection.Assembly.GetExecutingAssembly();
stream = ass.GetManifestResourceStream("smgClient.msg.wav");
pl = new System.Media.SoundPlayer(stream);
}

//请求连接
private void btnRequestConnect_Click(object sender, EventArgs e)
{
System.Threading.Thread th = new System.Threading.Thread(this.ToConnect);
th.Start();
}

//连接服务器
private void ToConnect()
{
try
{
IP = IPAddress.Parse(txtIP.Text.Trim());
int point = Convert.ToInt32(txtPoint.Text.Trim());
endpoint = new IPEndPoint(IP, point);
//建立Socket
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//建立连接
socket.Connect(endpoint);
//连接成功
lblStatus.Text = "连接成功.";

while (true)
{
socket.Receive(bs, bs.Length, 0);
pl.Play();
rtxtMsg.AppendText(System.Text.Encoding.Unicode.GetString(bs));
}
}
catch (FormatException)
{ MessageBox.Show("IP error OR Point error"); }
catch (ArgumentNullException)
{ MessageBox.Show("IP error OR Point error"); }
catch (Exception)
{
lblStatus.Text = "连接失败,原因: 服务器已停止.";
}
}

//字体
private void btnFont_Click(object sender, EventArgs e)
{
FontDialog font = new FontDialog();
font.ShowEffects = true;
font.ShowColor = true;
font.MinSize = 12;
font.Font = new Font("楷体_GB2312", 18, FontStyle.Bold);
font.Color = Color.Blue;

if (font.ShowDialog() == DialogResult.OK)
{
rtxtSend.Font = font.Font;
rtxtSend.ForeColor = font.Color;
}
}

//关闭连接
private void btnCloseConnect_Click(object sender, EventArgs e)
{
try
{
socket.Close();
lblStatus.Text = "连接已经关闭.";
}
catch
{
lblStatus.Text = "目前未建立连接.";
}
}

//发送消息
private void btnSend_Click(object sender, EventArgs e)
{
if (rtxtSend.Text.Trim() == "")
return;
else if (rtxtSend.Text.Trim().ToLower() == "clear()")
{
rtxtMsg.Clear();
rtxtSend.Text = "";
return;
}
else if (Regex.IsMatch(rtxtSend.Text.Trim().ToLower(), @"^[zoom(]+[\d]+[)]$"))
{
string str = rtxtSend.Text.ToLower();
int size = Convert.ToInt32(str.Substring(str.LastIndexOf('(') + 1,
str.IndexOf(')') - str.LastIndexOf('(') - 1));
rtxtMsg.Font = new Font("宋体", size, FontStyle.Bold);
return;
}
else if (Regex.IsMatch(rtxtSend.Text.Trim().ToLower(), @"^[down(]+[\d]+[)]$"))
{
string str = rtxtSend.Text.ToLower();
string size = str.Substring(str.LastIndexOf('(') + 1, str.IndexOf(')') - str.LastIndexOf('(') - 1);

if (Convert.ToInt32(size) > rtxtMsg.Text.Length)
return;

}
else if (Regex.IsMatch(rtxtSend.Text.Trim().ToLower(), @"^[up(]+[\d]+[)]$"))
{
string str = rtxtSend.Text.ToLower();
string size = str.Substring(str.LastIndexOf('(') + 1, str.IndexOf(')') - str.LastIndexOf('(') - 1);

}
else if (rtxtSend.Text.Trim().ToLower() == "exit(0)")
{
this.Close();
return;
}

try
{
byte[] bs = new byte[512];
string user = null;
if (txtUser.Text.Trim() == "在此输入你的名字" || txtUser.Text.Trim() == "")
{
user = "我";
bs = Encoding.Unicode.GetBytes(string.Format("对方说:({0})\r\n{1}\r\n", DateTime.Now.ToString(),rtxtSend.Text.Trim()));
}
else
{
bs = Encoding.Unicode.GetBytes(string.Format("{0}说:({1})\r\n{2}\r\n", txtUser.Text.Trim(),DateTime.Now.ToString(),rtxtSend.Text.Trim()));
user = txtUser.Text.Trim();
}

socket.Send(bs, bs.Length, 0);//发送

txt = string.Format("{0}说:({1})\r\n{2}\r\n", user, DateTime.Now.ToString(), rtxtSend.Text.Trim());
int tempLen = rtxtMsg.Text.Length;
rtxtMsg.AppendText(txt);
rtxtMsg.Select(tempLen, txt.Length);
rtxtMsg.SelectionFont = new Font("宋体", 10);
rtxtMsg.SelectionColor = Color.Red;
rtxtSend.Clear();
}
catch(Exception ex)
{ MessageBox.Show("连接尚未建立!无法发送数据!" + ex.Message); }
}

//避开打开多个
private void frmClient_Load(object sender, EventArgs e)
{
foreach (Process p in Process.GetProcesses())
{
if (p.ProcessName == Application.ProctName)//有进程
{
if (p.Id != Process.GetCurrentProcess().Id)//不是当前进程
{
p.Kill();
}
}
}
}

private void frmClient_FormClosing(object sender, FormClosingEventArgs e)
{
try
{
socket.Close();
}
catch(Exception) { }
finally
{
foreach (Process p in Process.GetProcesses())
{
if (p.ProcessName == Application.ProctName)
p.Kill();
}
}
}

private void frmClient_KeyDown(object sender, KeyEventArgs e)
{
if ((e.Control && e.KeyCode == Keys.Enter) || (e.Alt && e.KeyCode == Keys.S))
{
btnSend.PerformClick();
}
}

private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
this.TopMost = checkBox1.Checked;
}
}
}

D. 求一个C#最简单的TCP传输信息例子(实现聊天和传送文件,再简单点实现聊天也行)

给你点建议吧,服务器端负责保存你所有好友的IP及端口信息,即套接字信息,你双击你的好友(任意)时,你需要连接服务器给你的套接字,成功连接后,你就可以用,发送文字信息和文件了,这些都是socket的方法,很简单.当关闭聊天信息窗口的时候,记得要释放套接字,以便你下次打开使用,否则每个套接字只能使用一次.

E. linux 中tcp套接字编程实例中出现Bind() error :Address already in use 怎样解决

换一个端口,或者把正在占用这个端口的程序干掉。

F. 1、基于套接字Socket通信的编程: 建立TCPSocket进行通信,服务器端向客户端传送日期数据,客户端收到信息

//获取时间
CString strTime;
CTime st = CTime::GetCurrentTime();
strTime = st.Format("%Y%m%d%H%M%S");
//创建服务器端
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 1, 1 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}

if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );

return;
}

SOCKET sock = socket(AF_INET,SOCK_STREAM,0);
int opt = 1;
int len11 = sizeof(opt);

setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(char*)&opt,len11);
if (sock == INVALID_SOCKET)
{
// "初始化失败" ;
closesocket(sock);

return;
}
SOCKADDR_IN addrsrv;
addrsrv.sin_family = AF_INET;
addrsrv.sin_port = htons(6001);
addrsrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
if (bind(sock,(SOCKADDR*)&addrsrv,sizeof(SOCKADDR)) == SOCKET_ERROR)
{
// "绑定失败"
closesocket(sock);
return;
}
listen(sock,10);
//客户端接收服务器连接
char m_recvBuf[2000];
memset(m_recvBuf, 0, 2000);
while(TRUE)
{
SOCKET sNew = ::accept(sock, (SOCKADDR*)&addrRemote, &nAddrLen);//接收到客户端连接
//发送时间
int hvsndlen = 0;
int sndlen = 0;
while ((len -hvsndlen) > 0)
{
sndlen = send(soc,(LPCTSTR)strTime +hvsndlen,len-hvsndlen,0);
if (sndlen == SOCKET_ERROR)
{
return -1;
}
hvsndlen += sndlen;
}
}
//把以上程序放入你的主程序中,应该可以运行。里面有CString类型,如果用不习惯,你可以把CTime 转换成其他类型

G. linux 中TCP套接字编程实例 显示Bind() error:address already in use 怎么办 用netstat -nat 查看后结果

你所使用的套接字已被占用,在Bind()之前你是否申请了套接字,或者申请之后已经被占用,Bind所使用的套接字来源很重要,可以查查。再有就是linux里面你的程序如果非法退出或者没有使用close释放套接字,在程序结束以后系统会延时自动释放套接字资源,但是要等几分钟,之后你就可以重新使用了。

H. TCP套接字编程,麻烦把这个的程序和系统框图,网站结构图,数据库设计发我邮箱一下!1186679656qq.com

用C++编写
题目:TCP套接字编程
(1)合理设计系统框图和程序结构图。
(2)根据系统框图设计,编写程序代码。
(3)编写程序说明书。

实验内容:
1.主机间TCP的性能测试之一:回程时延。
2.服务器端能从客户端接收数据并立即将接收到的数据原样返回给客户方。
3.客户端能往服务器端发送数据,然后立即接受从服务器端原样返回的数据。

我这边还有一份指导书,不知道你们要不要看一下?如果要就发我邮箱,我发过去!

麻烦尽快发给我!谢谢!
如果好我还会加悬赏的!

I. TCP套接字编程

说白了就是socket通信协议,两边都遵循这个协议,然后确定终结点(ip和端口号),以tcp
或者udp的方式连接,进行通信,要提到的是tcp套接字通信必须一直保持连接

阅读全文

与tcp套接字编程实例相关的资料

热点内容
如何共享服务器的网络连接 浏览:130
程序员简易表白代码 浏览:163
什么是无线加密狗 浏览:60
国家反诈中心app为什么会弹出 浏览:64
cad压缩图打印 浏览:100
网页打开速度与服务器有什么关系 浏览:860
android开发技术文档 浏览:62
32单片机写程序 浏览:43
三星双清无命令 浏览:835
汉寿小程序源码 浏览:340
易助erp云服务器 浏览:530
修改本地账户管理员文件夹 浏览:416
python爬虫工程师招聘 浏览:283
小鹏p7听音乐哪个app好 浏览:354
linux下的防火墙 浏览:954
凌达压缩机美芝压缩机 浏览:350
php后面代码不执行 浏览:236
微我手机怎样设置应用加密 浏览:203
条件加密 浏览:630
androidstudio设置中文 浏览:643