導航:首頁 > 編程語言 > 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套接字編程實例相關的資料

熱點內容
pdf手寫筆 瀏覽:173
別永遠傷在童年pdf 瀏覽:984
愛上北斗星男友在哪個app上看 瀏覽:414
主力散戶派發源碼 瀏覽:665
linux如何修復伺服器時間 瀏覽:55
榮縣優途網約車app叫什麼 瀏覽:473
百姓網app截圖是什麼意思 瀏覽:222
php如何嵌入html 瀏覽:811
解壓專家怎麼傳輸 瀏覽:743
如何共享伺服器的網路連接 瀏覽:132
程序員簡易表白代碼 瀏覽:166
什麼是無線加密狗 瀏覽:63
國家反詐中心app為什麼會彈出 瀏覽:67
cad壓縮圖列印 瀏覽:102
網頁打開速度與伺服器有什麼關系 瀏覽:863
android開發技術文檔 瀏覽:65
32單片機寫程序 瀏覽:52
三星雙清無命令 瀏覽:839
漢壽小程序源碼 瀏覽:345
易助erp雲伺服器 瀏覽:533