① 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程序,並把它們分別安裝在伺服器端和客戶端,這樣就可以實現兩者通信了。
-
② 在java中實現TCP協議編程中怎麼傳
在Java中實現TCP協議編程
ServerSocket:編寫TCP網路服務程序,首先要用到java.net.ServerSocket類用以創建伺服器Socket
構造方法:
ServerSocket(intport):創建綁定到特定埠的伺服器套接字
ServerSocket(intport,intbacklog):利用指定的backlog(伺服器忙時保持連接請求的等待客戶數量),創建伺服器套接字並將其綁定到指定的本地埠號。
ServerSocket(intport,intbacklog,InetAddressbindAddr):使用指定的埠、偵聽backlog和要綁定到的本地IP地址創建伺服器。
Socket:客戶端要與伺服器建立連接,必須先創建一個Socket對象
常用構造方法
Socket(Stringhost,intport):創建一個流套接字並將其連接到指定主機上的指定埠號。
Socket(InetAddressaddress,intport):創建一個流套接字並將其連接到指定IP地址的指定埠號。
伺服器端程序調用ServerSocket類中的accept()方法等待客戶端的連接請求,一旦accept()接收了客戶端連接請求,該方法返回一個與該客戶端建立了專線連接的Socket對象,不用程序去創建這個Socket對象。建立了連接的兩個Socket是以IO流的方式進行數據交換的,Java提供了Socket類中的getInputStream()返回Socket的輸入流對象,getOutputStream()返回Socket的輸出流對象。
TCP伺服器與TCP客戶端間的數據的接受圖示:
用TCP實現伺服器與客戶端的「聊天」:
實例代碼:
客戶端:
packagecom.hbsi.net;
importjava.net.Socket;
importjava.io.*;
publicclassTcpClient{
publicstaticvoidmain(String[]args)throwsException{
//1.建立tcp客戶端socket,要確定要連接的伺服器ip,port
Sockets=newSocket("192.168.49.87",9009);
//獲取鍵盤錄入
BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));
//2.通過建立的socket,獲取輸出流對象
//數據輸出給伺服器端
OutputStreamout=s.getOutputStream();
BufferedWriterbwout=newBufferedWriter(newOutputStreamWriter(out));
//獲取伺服器端返回的數據
//讀取伺服器端發過來的信息InputStreamReader()
BufferedReaderbrin=newBufferedReader(newInputStreamReader(
s.getInputStream()));
Stringline=null;
while((line=br.readLine())!=null){
if(line.equals("over"))
break;
bwout.write(line);
bwout.newLine();
bwout.flush();
Stringstr=brin.readLine();
System.out.println("server:"+str);
}
br.close();
s.close();
}
}
伺服器端:
packagecom.hbsi.net;
importjava.io.BufferedReader;
importjava.io.BufferedWriter;
importjava.io.InputStream;
importjava.io.InputStreamReader;
importjava.io.OutputStreamWriter;
importjava.net.ServerSocket;
importjava.net.Socket;
publicclassTcpServer{
publicstaticvoidmain(String[]args)throwsException{
//1.建立伺服器socket
ServerSocketss=newServerSocket(9009);
//2.調用accept()
Sockets=ss.accept();
System.out.println(s.getInetAddress().getHostAddress()
+"...connection");
//讀取客戶的信息的輸入流
InputStreamin=s.getInputStream();
BufferedReaderbrin=newBufferedReader(newInputStreamReader(in));
//向客戶端發送信息輸出流,服務端向客戶端返回信息OutputStreamWriter()
BufferedWriterbrout=newBufferedWriter(newOutputStreamWriter(
s.getOutputStream())); Stringline=null;
while((line=brin.readLine())!=null){
System.out.println("client:"+line);
brout.write(line.toUpperCase());//伺服器端收到信息後,將信息轉為大寫返回給客戶端toUpperCase()
brout.newLine();
brout.flush();
}
s.close();
ss.close();
}
}
③ 怎樣在自己電腦上建立一個TCP伺服器
首先需要在電腦上搭建伺服器,關於網上好多按步驟安裝apache,sql,phpmyadmin的方法復雜而且沒有必要,這里推薦wamp這樣的一個集成軟體,安裝非常簡單,一路點擊next,apache+sql+phpmyadmin的環境一鍵搭好。
在網路中搜索Wamp下載,直接下載就行。下載完wamp進行安裝,一路點擊next,裝在c:\wamp下,最後install完成.
在瀏覽器輸入localhost,出現以下頁面說明安裝成功了。現在伺服器和php環境算是搭好了。此時在桌面右下角任務欄中會有wamp的圖標,點擊會有下圖顯示,www是網站頁面根目錄,localhost是網站默認主頁,點擊phpmyadmin可以進入資料庫管理界面.
現在網站只能在PC上顯示,如何能把網站放到互聯網上讓朋友也欣賞一下。這時就需要一款叫花生殼的軟體,提供動態的域名映射.
下載網址如下:http://hsk.oray.com/download/#type=windows|lan
下載完軟體按步驟安裝即可,這時候需要注冊一下花生殼會員,注冊時按網頁提示的步驟即可,用身份證注冊可以獲得一個免費域名。用注冊的賬號密碼登陸軟體。會出現以下界面。這里的網址是申請的免費域名。
在域名上右鍵,選擇新花生殼管理,填寫應用名稱,這個可以隨便填,內網主機為本機內網的ip地址,這時需要查看以下,win+R在cmd中輸入,ipconfig/all,
可以看到ipv4地址,填寫即可。埠為80埠。
同時,現在需要設置一下路由器。在瀏覽器輸入192.168.1.1。輸入路由器用戶名和密碼,一般都為admin。進入路由器界面。需要設置三個地方,首先是動態DNS,選擇服務商為花生殼,填寫用戶名密碼,驗證保存。然後是轉發規則中的虛擬伺服器,添加新條目,埠80,ip地址為內網ip。最後是,DMZ主機,設置開啟,ip為內網本機ip。
現在設置基本完成,這時就可以測試了。注意,要把防火牆關閉,否則外網還是訪問不了本機的網站。在控制面板中把防火牆關閉。現在可以寫一段html代碼,命名為index.html(注意此時先把index.php放到別的文件夾)放入wamp\www目錄中,來測試訪問。
最後,在瀏覽器輸入花生殼域名,看看是不是就能訪問了。同時也可以把自域名發送給朋友,讓他們幫測試一下。
④ java寫tcp客戶端測試類該怎麼寫
1.TCP服務端的程序編寫
package test;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class MyTcp{
private BufferedReader reader;
private ServerSocket serverSocket;
private Socket socket;
/**
* 創建服務端的程序,讀取客戶端傳來的數據
*/
void getserver(){
try {
serverSocket = new ServerSocket(8998); //實例化服務端socket
System.out.println("伺服器套接字已經創建成功");
while (true) {
System.out.println("等待客戶機的連接:");
socket = serverSocket.accept(); //實例化socket對象
reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); //實例化BufferReader對象
getClientMessage();
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void getClientMessage() {
try {
while (true) {
System.out.println("客戶機傳來的信息是:"+reader.readLine());
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
MyTcp myTcp = new MyTcp(); //創建本類對象
myTcp.getserver();
}
}
2.TCP客戶端程序編寫
package test;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.PrintWriter;
import java.net.Socket;
import java.nio.channels.WritableByteChannel;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.BevelBorder;
public class MyTcpClient extends JFrame{
private PrintWriter printWriter;
Socket socket;
private JTextField jTextField = new JTextField();
private JTextArea jTextArea = new JTextArea();
Container container;
/**
* 創建的Tcp客戶端程序
*/
public MyTcpClient (String title) {
super(title);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
container = this.getContentPane();
final JScrollPane jScrollPane = new JScrollPane();
jScrollPane.setBorder(new BevelBorder(BevelBorder.RAISED)); //顯示邊框
getContentPane().add(jScrollPane,BorderLayout.CENTER);
jScrollPane.setViewportView(jTextArea);
container.add(jTextField,"South"); //將文本框放在窗體下面
jTextField.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
printWriter.println(jTextField.getText()); //將文本框的信息寫入流(為下面的輸出流寫入信息做准備)
jTextArea.append(jTextField.getText() + "\n");
jTextArea.setSelectionEnd(jTextArea.getText().length());
jTextField.setText(null);
}
});
}
private void connect() {
jTextArea.append("嘗試連接中...\n");
try {
socket = new Socket("127.0.0.1",8998);
printWriter = new PrintWriter(socket.getOutputStream(),true); //將printwriter中的信息流寫入到套接字的輸出流傳送給服務端
jTextArea.setText("已完成連接\n\n");
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
MyTcpClient myTcpClient = new MyTcpClient("向伺服器發送數據");
myTcpClient.setSize(500,200);
myTcpClient.setVisible(true);
myTcpClient.connect();
}
}
3.效果展示
<1>先將服務端的程序跑起來
<2>再將客戶端的程序跑起來
<3>.客戶端和服務端進行交互
⑤ 請問JAVA中創建一個TCP伺服器端程序的驟是什麼呢
1.建立一個伺服器socket並開始監聽.
2.使用accept()方法取得新的連接.
3.建立輸入和輸出流.
4.在已有的協議上產生會話.
5.關閉客戶端流和socket.
6.回到第二步或者到第七步.
7.關閉伺服器socket.
⑥ 如何編寫用TCP/IP的通訊程序
首先要講一下他們的一些設置(屬性):
TServerSocket 的幾個屬性
Active
是否是工作狀態,可以把它設置為ture或false來啟動和停止偵聽。
Port
本機偵聽的埠,可以設置為一大於1024的數;
ServerType
服務端的工作方式,有兩個選擇,一個是stNonBlocking 非阻塞方式,一個是stThreadBlocking線程阻塞方式,默認是非阻塞方式。用非阻塞方式編程比較簡單(我個人認為),用阻塞方式對每個連接必須自己用線程來控制收發。
ThreadCacheSize
緩沖的線程個數 當ServerType是stThreadBlocking時有效。
TClientSocket 的幾個屬性
Active
是否是工作狀態,可以把它設置為ture或false來同服務端建立或斷開連接。
Host
伺服器(ServerSocket)的計算機名,是一個字元串
Address
伺服器(ServerSocket)的IP地址
ClientType
客戶端的工作方式一種是ctNonBlocking非阻塞方式,一種是ctBlocking阻塞方式,默認是非阻塞方式
Port
同服務端(ServerSocket)連接的埠,這個埠就是ServerSocket的偵聽 埠
在設置ClientSocket的(Host)主機名和設置(Address)IP地址是等效的,但設主機名需要網路具有DNS(域名解析服務)伺服器,而且設主機名要比設主機的IP地址連接的速度慢一些。建議用Address來同ServerSocket進行連接。
設置好所有的屬性後,ServerSocket控制項就可以通過將它的Active屬性置為true來進行偵聽了。ClientSocket可以通過設置它的Active屬性來同ServerSocket進行連接。連接成功就可以進行通訊了。在這個過程中會產生一些事件,下面說說他們各自的事件。
TServerSocket的幾個事件
OnAccept
當一個客戶同服務端連接成功後產生這個事件,產生這個事件後這個連接就可用了,可以對這個客戶進行發送和接收數據。
OnClientConnect
當一個客戶正在同服務端建立連接的時候產生此事件,在這里你可以決定是否接受這個連接。
OnClientDisconnect
當一個客戶同服務端的連接斷開的時候產生此事件,你需要在這里進行一些處理,如從連接列表中清除次連接釋放內存等。
OnClientError
當客戶同服務端出現錯誤時產生此事件,在此事件中你可以通過設置ErrorCode = 0來屏蔽系統的錯誤提示。這樣就可以避免討厭的英文錯誤了。根據ErrorEvent的不同的值來得知發生了什麼錯誤,它有一下幾中錯誤類型
eeGeneral 未知錯誤
eeSend 發送數據出現錯誤
eeReceive 接收數據出現錯誤
eeConnect 客戶請求連接時出現錯誤
eeDisconnect 客戶斷開連接時出現錯誤
eeAccept 接受一個客戶時發生錯誤
一般來講,當發生錯誤的時候這個客戶的連接就已經不可用了,要對這個客戶進行連接失敗處理。
OnClientRead
當服務端收到客戶端發來的數據的時候產生此事件。接收客戶端的數據都在這里進行。
OnClientWrite
當服務端發送數據的時候產生此事件。
TClientSocket的幾個事件
OnConnect
同服務端(ServerSocket)連接成功後將產生此事件,產生此事件後才說明這個連接可用了,這時才可以向ServerSocket發送數據。
OnConnecting
正在同服務端進行連接是產生此事件。
OnDisconnect
同服務端的連接斷開後產生此事件,產生此事件後ClientSocket的Active屬性就為false了,這時這個連接就不可用了,必須重新進行連接才能向伺服器發送數據。
OnError
當Socket發生錯誤時產生此事件,這個事件的意義和ServerSocket的Error事件完全一樣,只是它沒有eeAccept錯誤。
OnRead
當接收到服務端發來的數據後產生此事件。
OnWrite
當向服務端發送數據的時候產生此事件。
⑦ C#TCP非同步伺服器和客戶端咋連接
TCP伺服器端的客戶端使用的方法不一樣,伺服器被叫,客戶端主叫。伺服器程序,設定一個埠用於客戶端呼叫連接,聲明一個socket綁定到這個埠,偵聽客戶端呼叫即可。客戶端聲明一個socket,通過客戶端socket對伺服器指定埠發出連接請求(主叫),伺服器相應此連接請求,建立連接,然後就可以互相通訊了。
伺服器和客戶端,就是在主叫與被叫上有區別,建立連接後,數據的收發都是一樣的。
⑧ C++ TCP客戶端代碼怎麼寫
C++ TCP客戶端代碼寫法:
客戶端編程的步驟:
1:載入套接字型檔,創建套接字(WSAStartup()/socket());
2:向伺服器發出連接請求(connect());
3:和伺服器端進行通信(send()/recv());
4:關閉套接字,關閉載入的套接字型檔(closesocket()/WSACleanup())。
代碼:
#include<stdio.h>
#include<Winsock2.h>
#pragmacomment(lib,"WS2_32.lib")
voidmain()
{
WORDwVersionRequested;
WSADATAwsaData;
interr;
wVersionRequested=MAKEWORD(1,1);
err=WSAStartup(wVersionRequested,&wsaData);
if(err!=0)
{
return;
}
if(LOBYTE(wsaData.wVersion)!=1||
HIBYTE(wsaData.wVersion)!=1)
{
WSACleanup();
return;
}
SOCKETsockSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_INaddrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
listen(sockSrv,5);
SOCKADDR_INaddrClient;
intlen=sizeof(SOCKADDR);
while(1)
{
SOCKETsockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
charsendBuf[50];
sprintf(sendBuf,"Welcome%stohere!",inet_ntoa(addrClient.sin_addr));
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
charrecvBuf[50];
recv(sockConn,recvBuf,50,0);
printf("%s ",recvBuf);
closesocket(sockConn);
}
}
⑨ 編寫一個簡單的TCP通信程序。伺服器發送「你好我是伺服器」,客戶端接收該信息並顯示在屏幕上。用Java寫
1、伺服器端
importjava.io.DataOutputStream;
importjava.io.IOException;
importjava.net.ServerSocket;
importjava.net.Socket;
publicclassSocketServer{
privatestaticfinalintPORT=8088;
publicstaticvoidmain(String[]args){
ServerSocketserver=null;
try{
server=newServerSocket(PORT);
while(true){
Socketclient=server.accept();
newThread(newServer(client)).start();
}
}catch(IOExceptione){
e.printStackTrace();
}
}
}
classServerimplementsRunnable{
privateSocketclient;
publicServer(Socketclient){
this.client=client;
}
publicvoidrun(){
DataOutputStreamoutput=null;
try{
output=newDataOutputStream(client.getOutputStream());
output.writeUTF("你好我是伺服器");
}catch(IOExceptione){
e.printStackTrace();
}finally{
try{
if(output!=null)output.close();
output=null;
}catch(IOExceptione){}
}
}
}
2、客戶端
importjava.io.DataInputStream;
importjava.io.IOException;
importjava.net.Socket;
importjava.net.UnknownHostException;
{
privatestaticfinalintPORT=8088;
publicstaticvoidmain(String[]args){
Socketsocket=null;
try{
socket=newSocket("127.0.0.1",PORT);
DataInputStreamin=newDataInputStream(socket.getInputStream());
Stringres=in.readUTF();
System.out.println(res);
if(in!=null)in.close();
}catch(UnknownHostExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}finally{
if(socket!=null){
try{
socket.close();
}catch(IOExceptione){}
}
}
}
}