Lập trình Socket
+21
LETHIANHDAO48(I22B)
Huynh Xuan Dat(I22A)
Dao Duy Thanh(I22B)
NguyenMinhTri(i22a)
PhamPhuKhanh52(I22B)
vokimthong
xuantri27 (I11C)
ChauQuangCam (I22B)
NguyenHoangKimVu (I11C)
HaVanMinh(I22A)
LeThanhQuang (I22B)
MaiXuanSon (I22B)
VoMinhDien(I22B)
QuangMinhTuan(I22B)
PhanPhamDanPhuong(I22B)
NguyenManhHuy(I22B)
TranBinhCongLuanI12A
AnhDao(I22B)
NguyenNhatHuy64(I22B)
NguyenQuocHuy (I22B)
Admin
25 posters
Trang 2 trong tổng số 2 trang
Trang 2 trong tổng số 2 trang • 1, 2
Lập trình Socket với Java
Mời các bạn xem thử.
http://www.cse.hcmut.edu.vn/~ptvu/ip/lec2.pdf
http://www.cse.hcmut.edu.vn/~ptvu/ip/lec2.pdf
vokimthong- Tổng số bài gửi : 12
Join date : 15/03/2013
Đến từ : I22A
Re: Lập trình Socket
TranBinhCongLuanI12A đã viết:Hi!NguyenHoangKimVu (I11C) đã viết:Bạn nên xem lại C, C++ vì nó là nền tảng và cơ bản nhất. Hiểu nó rõ rồi thì mấy ngôn ngữ sau này sẽ dễ sử dụng hơn.TranBinhCongLuanI12A đã viết:Chào các bạn, mình đã lâu không đụng đến ngôn ngữ lập trình, vì vậy có thể gọi là người trở về hoặc người mới. Theo các bạn, mình nên tìm đọc các tài liệu nào để dể tiếp thu các ngôn ngữ này, ít nhất cũng là ngôn ngữ VB.
Thanks!
Đề tài này là QuangMinhTuan(I22B) viết, nhưng không hiểu sao bạn Quote thành mình
Mình thì lại ko tán đồng với ý kiến trên của bạn.
Đúng là C,C++ nó là nền tảng và cơ bản nhất, nhưng việc lập trình trên 1 môi trường trực quan
với 1 môi trường toàn là dòng lệnh thì bạn nghĩ sẽ tiếp thu cái nào nhanh hơn
C++ giờ cũng sử dụng được Winform mà bạn. Những thuật giải chúng ta học đa phần là trên C, C++ hết á. Từ đó mới phát triển thêm cho những ngôn ngữ sau này.
NguyenHoangKimVu (I11C)- Tổng số bài gửi : 62
Join date : 25/08/2011
vi du ve socket
PHP Code:
#include
#include
#include
#include
#pragma comment (lib,"ws2_32.lib")
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA SData;
int iResult = WSAStartup(0x0202,&SData);
if (iResult!=0){
cout << "KHONG THE KHOI DONG WINSOCK";
return 1;
}
cout << "KHOI TAO SOCKET THANH CONG: \n";
WSACleanup();
system("pause");
return 0;
}
#include
#include
#include
#include
#pragma comment (lib,"ws2_32.lib")
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA SData;
int iResult = WSAStartup(0x0202,&SData);
if (iResult!=0){
cout << "KHONG THE KHOI DONG WINSOCK";
return 1;
}
cout << "KHOI TAO SOCKET THANH CONG: \n";
WSACleanup();
system("pause");
return 0;
}
PhamPhuKhanh52(I22B)- Tổng số bài gửi : 14
Join date : 14/03/2013
Re: Lập trình Socket
LeThanhQuang (I22B) đã viết:AnhDao(I22B) đã viết:Chào bạn !
Mình hỉu ý thứ 2 của bạn . Mình cũng đã trình bày ở ví dụ trên rồi , Nhưng vấn đề mình muốn mở rộng ra như sau :
+ Mình muốn dùng chỉ 1 câu trả lời duy nhất từ sever " chào em TCP1, TCP2, TCP3, ..., TCP100" , câu trả lời này được chuyển đến từng client
+ Nhưng khi client nhận dc ko phải là văn bản chung như trên. mà phải đúng với từng TCP
Cụ Thể : sever " chào em TCP1, TCP2, TCP3, ..., TCP100"
TCP1 nhận dc : " chào e TCP1 "
TCP2 nhận dc : " chào e TCP2 "
.....
TCP100 nhận dc : " chào e TCP100 "
+ Mình muốn chỉ 1 lần trả lời , nhưng nó tự tách ra ,tìm và trả lời đúng client của nó ....
Liệu có làm vậy dc k0?
Cảm ơn bạn nha .... hj
Ý của bạn rất hay nhưng theo mình nghĩ để giải quyết câu trả lời của bạn thì ta sẽ xét hai trường hợp
- TH1: là tên của những bạn ngồi với máy Client nào sẽ phải trùng với tên của máy TCP Client đó
+ Lúc đó ta sẽ áp dụng cách của bạn "CongLuan" là ổn nhất.
+ Còn nếu làm như ý của bạn là nhập trên máy sever " chào em TCP1, TCP2, TCP3, ..., TCP100" thì ta chỉ việc cho một đoạn code kiểm tra text nào trùng với tên của máy Client thì trả kết quả tương ứng (nhưng cái này không thực tế vì nó tốn nhiều thời gian của người dùng để nhập tên)
- TH2: là một tên tùy ý ở từng máy Client
ví dụ: TCP1: chào thầy em là Tuấn
TCP2: chào thầy em là Nam
Những nội dung này nó chỉ là dạng text nên theo mình nó không thể nào phân biệt được tên người hay nội dung nên câu hỏi của bạn đặt ra là không thể khả thi được.
Trừ khi bạn sẽ phải có một qui định để nhận biết tên người và nội dung như ví dụ trên của mình, dấu hiệu nhận biết là chữ cái bắt đầu là chữ hoa và kết thúc là khoảng trắng, lúc đó ta dùng đoạn code kiểm tra đoạn text ở từng máy Client kết hợp với biện pháp của bạn "CongLuan" thỉ câu hỏi của bạn mới có đáp án như ý được.
Admin
- Rất đúng với ý thày. Chưa trả lời là để chờ ý kiến này "xuất hiện" !
- Cảm giác rằng bạn AnhDao hơi "phóng đại" vấn đề !
Mình có cách giải quyết vấn đề tên của từng người như sau.
- Trước khi kết nối tới sever mình sẽ cho người dùng nhập tên vào, mình sẽ lấy đó như một định danh người dùng, khi thầy trả lời sẽ dựa vào tên nhập lúc đầu và trả lời.
VD: Bạn tên là AnhDao trước khi chọn button kết nối tới sever thì Client sẽ có 1 text box nhập tên, lớp chẳng hạn. Khi thầy trả lời sẽ dựa vào tên trong text box nhập tên để trả lời ra
NguyenMinhTri(i22a)- Tổng số bài gửi : 9
Join date : 09/03/2013
Re: Lập trình Socket
TranBinhCongLuanI12A đã viết:Hi!NguyenHoangKimVu (I11C) đã viết:Bạn nên xem lại C, C++ vì nó là nền tảng và cơ bản nhất. Hiểu nó rõ rồi thì mấy ngôn ngữ sau này sẽ dễ sử dụng hơn.TranBinhCongLuanI12A đã viết:Chào các bạn, mình đã lâu không đụng đến ngôn ngữ lập trình, vì vậy có thể gọi là người trở về hoặc người mới. Theo các bạn, mình nên tìm đọc các tài liệu nào để dể tiếp thu các ngôn ngữ này, ít nhất cũng là ngôn ngữ VB.
Thanks!
Đề tài này là QuangMinhTuan(I22B) viết, nhưng không hiểu sao bạn Quote thành mình
Mình thì lại ko tán đồng với ý kiến trên của bạn.
Đúng là C,C++ nó là nền tảng và cơ bản nhất, nhưng việc lập trình trên 1 môi trường trực quan
với 1 môi trường toàn là dòng lệnh thì bạn nghĩ sẽ tiếp thu cái nào nhanh hơn
Theo TranBinhCongLuanI12A thì dùng trong môi trường trực quan mà ko học cơ bản thì ko bao giờ phát triển được phần mềm tốt hơn
NguyenMinhTri(i22a)- Tổng số bài gửi : 9
Join date : 09/03/2013
Re: Lập trình Socket
Mình ko chuyên về C# và .Net lắm mình chỉ có demo về java thôi nên share cho mọi người xem thử
http://www.mediafire.com/?8b0n8jl91tmdn10
http://www.mediafire.com/?8b0n8jl91tmdn10
NguyenMinhTri(i22a)- Tổng số bài gửi : 9
Join date : 09/03/2013
Lập trình Socket giao tiếp TCP client/server
Các lớp .Net cơ bản trong lập trình mạng
Các lớp này được cung cấp trong hai namespace System.Net và System.Net.Sockets. Hai namespace này chứa rất nhiều lớp dùng trong lập trình mạng, nhưng trong phạm vi này ta chỉ quan tâm đến các lớp sau:
Class Namespace Desciption
Kết nối Server-Client với TCP/IP
Khi được chạy, server cần được xác định rõ địa chỉ IP và sẽ “lắng nghe” trên một port cụ thể. Server sẽ nằm trong trạng thái này cho đến khi client gửi đến một yêu cầu kết nối. Sau khi được server chấp nhận, một connection sẽ hình thành cho phép server và client giao tiếp với nhau.
Cụ thể hơn, các bước tiến hành trên server và client mà ta cần thực hiện sử dụng giao thức TCP/IP trong C# (có thể chạy server và client trên cùng một máy):
Server:
Tạo một đối tượng System.Net.Sockets.TcpListener để bắt đầu “lắng nghe” trên một cổng cục bộ.
Đợi và chấp nhận kết nối từ client với phương thức AccepSocket(). Phương thức này trả về một đối tượng System.Net.Sockets.Socket dùng để gửi và nhận dữ liệu.
Thực hiện giao tiếp với client.
Đóng Socket.
Thông thường quy trình này sẽ được đặt trong một vòng lặp (lặp lại bước 2) để chấp nhận nhiều kết nối cùng lúc (sử dụng Thread) hoặc các kết nối lần lượt.
Client:
Tạo một đối tượng System.Net.Sockets.TcpClient
Kết nối đến server với địa chỉ và port xác định với phương thức TcpClient.Connect()
Lấy luồng (stream) giao tiếp bằng phương thức TcpClient.GetStream().
Thực hiện giao tiếp với server.
Đóng luồng và socket.
Example v1: Gửi nhận dữ liệu dạng byte[]
Lớp NetworkStream và Socket cung cấp các phương thức gửi và nhận dữ liệu dạng mảng byte. Vì vậy bạn cần phải thực hiện các bước chuyển đổi dữ liệu sang dạng byte và ngược lại. Trong ví dụ sau tôi sử dụng dữ liệu dạng văn bản ASCII trong console, và dùng các lớp trong namespace System.Text để chuyển đổi. Có hai cách bạn có thể áp dụng:
- Dùng các static property của lớp abstract System.Text.Encoding với các phương thức GetString() và GetBytes().
- Tạo đối tượng có kiểu XXXEncoding (thừa kế từ System.Text.Encoding). Ví dụ: UTF8Encoding, ASCIIEncoding,…
Một ví dụ gửi nhận dữ liệu đơn giản nhất sử dụng TCPListener, Socket (phía server) và TCPClient, NetworkStream (phía client) dạng mảng byte với địa chỉ loop-back 127.0.0.1 trên cùng một máy.
Tạo hai dự án console là Y2Server và Y2Client với nội dung sau:
Y2Server.cs (v1):
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
public class Y2Server {
private const int BUFFER_SIZE=1024;
private const int PORT_NUMBER=9999;
static ASCIIEncoding encoding=new ASCIIEncoding();
public static void Main() {
try {
IPAddress address = IPAddress.Parse("127.0.0.1");
TcpListener listener=new TcpListener(address,PORT_NUMBER);
// 1. listen
listener.Start();
Console.WriteLine("Server started on "+listener.LocalEndpoint);
Console.WriteLine("Waiting for a connection...");
Socket socket=listener.AcceptSocket();
Console.WriteLine("Connection received from " + socket.RemoteEndPoint);
// 2. receive
byte[] data=new byte[BUFFER_SIZE];
socket.Receive(data);
string str=encoding.GetString(data);
// 3. send
socket.Send(encoding.GetBytes("Hello "+str));
// 4. close
socket.Close();
listener.Stop();
}
catch (Exception ex) {
Console.WriteLine("Error: " + ex);
}
Console.Read();
}
}
Y2Client.cs (v1):
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Net.Sockets;
public class Y2Client{
private const int BUFFER_SIZE=1024;
private const int PORT_NUMBER=9999;
static ASCIIEncoding encoding= new ASCIIEncoding();
public static void Main() {
try {
TcpClient client = new TcpClient();
// 1. connect
client.Connect("127.0.0.1",PORT_NUMBER);
Stream stream = client.GetStream();
Console.WriteLine("Connected to Y2Server.");
Console.Write("Enter your name: ");
string str = Console.ReadLine();
// 2. send
byte[] data=encoding.GetBytes(str);
stream.Write(data,0,data.Length);
// 3. receive
data =new byte[BUFFER_SIZE];
stream.Read(data,0,BUFFER_SIZE);
Console.WriteLine(encoding.GetString(data));
// 4. Close
stream.Close();
client.Close();
}
catch (Exception ex) {
Console.WriteLine("Error: " + ex);
}
Console.Read();
}
}
Để kiểm tra ví dụ, bạn chạy server trước, cửa sổ console của server sẽ hiển thị:
Server started on 127.0.0.1:9999
Waiting for a connection…
Tiếp đến cho chạy client, nếu kết nối thành công, server sẽ hiển thị thêm dòng thông báo tương tự như sau:
Connection received from 127.0.0.1:2578
Chuyển qua cửa sổ console của client và nhập tên của bạn vào, nếu nhận được dữ liệu, server sẽ gửi trả lại dòng thông điệp “Hello [Your Name]”
Connected to Y2Server.
Enter your name: Yin Yang
Hello Yin Yang
Ngay sau bước này, cả server và client đều thực hiện đóng kết nối.
Example v2: Sử dụng StreamReader và StreamWriter
Sẽ tiện lợi hơn nếu ta sử dụng StreamReader và StreamWriter để gửi nhận dữ liệu mà không cần bước chuyển đổi qua lại mảng byte. Các đối tượng StreamReader và StreamWriter có thể được khởi tạo trực tiếp từ NetworkStream. Thuộc tính AutoFlush của StreamWriter thường được đặt là true để tự động gửi dữ liệu mà không cần đợi bộ đệm đầy hoặc bạn phải gọi thủ công phương thức Flush().
Ví dụ sau sử dụng vòng lặp để thực hiện gửi nhận dữ liệu liên tục giữa server/client cho đến khi client nhập vào chuỗi “exit”:
Y2Server.cs (v2):
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
public class Y2Server {
private const int BUFFER_SIZE=1024;
private const int PORT_NUMBER=9999;
static ASCIIEncoding encoding=new ASCIIEncoding();
public static void Main() {
try {
IPAddress address = IPAddress.Parse("127.0.0.1");
TcpListener listener=new TcpListener(address,PORT_NUMBER);
// 1. listen
listener.Start();
Console.WriteLine("Server started on "+listener.LocalEndpoint);
Console.WriteLine("Waiting for a connection...");
Socket socket=listener.AcceptSocket();
Console.WriteLine("Connection received from " + socket.RemoteEndPoint);
var stream = new NetworkStream(socket);
var reader=new StreamReader(stream);
var writer=new StreamWriter(stream);
writer.AutoFlush=true;
while(true)
{
// 2. receive
string str=reader.ReadLine();
if(str.ToUpper()=="EXIT")
{
writer.WriteLine("bye");
break;
}
// 3. send
writer.WriteLine("Hello "+str);
}
// 4. close
stream.Close();
socket.Close();
listener.Stop();
}
catch (Exception ex) {
Console.WriteLine("Error: " + ex);
}
Console.Read();
}
}
Y2Client.cs (v2):
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Net.Sockets;
public class Y2Client{
private const int BUFFER_SIZE=1024;
private const int PORT_NUMBER=9999;
static ASCIIEncoding encoding= new ASCIIEncoding();
public static void Main() {
try {
TcpClient client = new TcpClient();
// 1. connect
client.Connect("127.0.0.1",PORT_NUMBER);
Stream stream = client.GetStream();
Console.WriteLine("Connected to Y2Server.");
while(true)
{
Console.Write("Enter your name: ");
string str = Console.ReadLine();
var reader=new StreamReader(stream);
var writer=new StreamWriter(stream);
writer.AutoFlush=true;
// 2. send
writer.WriteLine(str);
// 3. receive
str=reader.ReadLine();
Console.WriteLine(str);
if(str.ToUpper()=="BYE")
break;
}
// 4. close
stream.Close();
client.Close();
}
catch (Exception ex) {
Console.WriteLine("Error: " + ex);
}
Console.Read();
}
}
Bạn chạy ví dụ này giống như ví dụ đầu tiên và gõ ‘exit’ vào client để thoát ứng dụng.
Các lớp này được cung cấp trong hai namespace System.Net và System.Net.Sockets. Hai namespace này chứa rất nhiều lớp dùng trong lập trình mạng, nhưng trong phạm vi này ta chỉ quan tâm đến các lớp sau:
Class Namespace Desciption
Kết nối Server-Client với TCP/IP
Khi được chạy, server cần được xác định rõ địa chỉ IP và sẽ “lắng nghe” trên một port cụ thể. Server sẽ nằm trong trạng thái này cho đến khi client gửi đến một yêu cầu kết nối. Sau khi được server chấp nhận, một connection sẽ hình thành cho phép server và client giao tiếp với nhau.
Cụ thể hơn, các bước tiến hành trên server và client mà ta cần thực hiện sử dụng giao thức TCP/IP trong C# (có thể chạy server và client trên cùng một máy):
Server:
Tạo một đối tượng System.Net.Sockets.TcpListener để bắt đầu “lắng nghe” trên một cổng cục bộ.
Đợi và chấp nhận kết nối từ client với phương thức AccepSocket(). Phương thức này trả về một đối tượng System.Net.Sockets.Socket dùng để gửi và nhận dữ liệu.
Thực hiện giao tiếp với client.
Đóng Socket.
Thông thường quy trình này sẽ được đặt trong một vòng lặp (lặp lại bước 2) để chấp nhận nhiều kết nối cùng lúc (sử dụng Thread) hoặc các kết nối lần lượt.
Client:
Tạo một đối tượng System.Net.Sockets.TcpClient
Kết nối đến server với địa chỉ và port xác định với phương thức TcpClient.Connect()
Lấy luồng (stream) giao tiếp bằng phương thức TcpClient.GetStream().
Thực hiện giao tiếp với server.
Đóng luồng và socket.
Example v1: Gửi nhận dữ liệu dạng byte[]
Lớp NetworkStream và Socket cung cấp các phương thức gửi và nhận dữ liệu dạng mảng byte. Vì vậy bạn cần phải thực hiện các bước chuyển đổi dữ liệu sang dạng byte và ngược lại. Trong ví dụ sau tôi sử dụng dữ liệu dạng văn bản ASCII trong console, và dùng các lớp trong namespace System.Text để chuyển đổi. Có hai cách bạn có thể áp dụng:
- Dùng các static property của lớp abstract System.Text.Encoding với các phương thức GetString() và GetBytes().
- Tạo đối tượng có kiểu XXXEncoding (thừa kế từ System.Text.Encoding). Ví dụ: UTF8Encoding, ASCIIEncoding,…
Một ví dụ gửi nhận dữ liệu đơn giản nhất sử dụng TCPListener, Socket (phía server) và TCPClient, NetworkStream (phía client) dạng mảng byte với địa chỉ loop-back 127.0.0.1 trên cùng một máy.
Tạo hai dự án console là Y2Server và Y2Client với nội dung sau:
Y2Server.cs (v1):
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
public class Y2Server {
private const int BUFFER_SIZE=1024;
private const int PORT_NUMBER=9999;
static ASCIIEncoding encoding=new ASCIIEncoding();
public static void Main() {
try {
IPAddress address = IPAddress.Parse("127.0.0.1");
TcpListener listener=new TcpListener(address,PORT_NUMBER);
// 1. listen
listener.Start();
Console.WriteLine("Server started on "+listener.LocalEndpoint);
Console.WriteLine("Waiting for a connection...");
Socket socket=listener.AcceptSocket();
Console.WriteLine("Connection received from " + socket.RemoteEndPoint);
// 2. receive
byte[] data=new byte[BUFFER_SIZE];
socket.Receive(data);
string str=encoding.GetString(data);
// 3. send
socket.Send(encoding.GetBytes("Hello "+str));
// 4. close
socket.Close();
listener.Stop();
}
catch (Exception ex) {
Console.WriteLine("Error: " + ex);
}
Console.Read();
}
}
Y2Client.cs (v1):
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Net.Sockets;
public class Y2Client{
private const int BUFFER_SIZE=1024;
private const int PORT_NUMBER=9999;
static ASCIIEncoding encoding= new ASCIIEncoding();
public static void Main() {
try {
TcpClient client = new TcpClient();
// 1. connect
client.Connect("127.0.0.1",PORT_NUMBER);
Stream stream = client.GetStream();
Console.WriteLine("Connected to Y2Server.");
Console.Write("Enter your name: ");
string str = Console.ReadLine();
// 2. send
byte[] data=encoding.GetBytes(str);
stream.Write(data,0,data.Length);
// 3. receive
data =new byte[BUFFER_SIZE];
stream.Read(data,0,BUFFER_SIZE);
Console.WriteLine(encoding.GetString(data));
// 4. Close
stream.Close();
client.Close();
}
catch (Exception ex) {
Console.WriteLine("Error: " + ex);
}
Console.Read();
}
}
Để kiểm tra ví dụ, bạn chạy server trước, cửa sổ console của server sẽ hiển thị:
Server started on 127.0.0.1:9999
Waiting for a connection…
Tiếp đến cho chạy client, nếu kết nối thành công, server sẽ hiển thị thêm dòng thông báo tương tự như sau:
Connection received from 127.0.0.1:2578
Chuyển qua cửa sổ console của client và nhập tên của bạn vào, nếu nhận được dữ liệu, server sẽ gửi trả lại dòng thông điệp “Hello [Your Name]”
Connected to Y2Server.
Enter your name: Yin Yang
Hello Yin Yang
Ngay sau bước này, cả server và client đều thực hiện đóng kết nối.
Example v2: Sử dụng StreamReader và StreamWriter
Sẽ tiện lợi hơn nếu ta sử dụng StreamReader và StreamWriter để gửi nhận dữ liệu mà không cần bước chuyển đổi qua lại mảng byte. Các đối tượng StreamReader và StreamWriter có thể được khởi tạo trực tiếp từ NetworkStream. Thuộc tính AutoFlush của StreamWriter thường được đặt là true để tự động gửi dữ liệu mà không cần đợi bộ đệm đầy hoặc bạn phải gọi thủ công phương thức Flush().
Ví dụ sau sử dụng vòng lặp để thực hiện gửi nhận dữ liệu liên tục giữa server/client cho đến khi client nhập vào chuỗi “exit”:
Y2Server.cs (v2):
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
public class Y2Server {
private const int BUFFER_SIZE=1024;
private const int PORT_NUMBER=9999;
static ASCIIEncoding encoding=new ASCIIEncoding();
public static void Main() {
try {
IPAddress address = IPAddress.Parse("127.0.0.1");
TcpListener listener=new TcpListener(address,PORT_NUMBER);
// 1. listen
listener.Start();
Console.WriteLine("Server started on "+listener.LocalEndpoint);
Console.WriteLine("Waiting for a connection...");
Socket socket=listener.AcceptSocket();
Console.WriteLine("Connection received from " + socket.RemoteEndPoint);
var stream = new NetworkStream(socket);
var reader=new StreamReader(stream);
var writer=new StreamWriter(stream);
writer.AutoFlush=true;
while(true)
{
// 2. receive
string str=reader.ReadLine();
if(str.ToUpper()=="EXIT")
{
writer.WriteLine("bye");
break;
}
// 3. send
writer.WriteLine("Hello "+str);
}
// 4. close
stream.Close();
socket.Close();
listener.Stop();
}
catch (Exception ex) {
Console.WriteLine("Error: " + ex);
}
Console.Read();
}
}
Y2Client.cs (v2):
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Net.Sockets;
public class Y2Client{
private const int BUFFER_SIZE=1024;
private const int PORT_NUMBER=9999;
static ASCIIEncoding encoding= new ASCIIEncoding();
public static void Main() {
try {
TcpClient client = new TcpClient();
// 1. connect
client.Connect("127.0.0.1",PORT_NUMBER);
Stream stream = client.GetStream();
Console.WriteLine("Connected to Y2Server.");
while(true)
{
Console.Write("Enter your name: ");
string str = Console.ReadLine();
var reader=new StreamReader(stream);
var writer=new StreamWriter(stream);
writer.AutoFlush=true;
// 2. send
writer.WriteLine(str);
// 3. receive
str=reader.ReadLine();
Console.WriteLine(str);
if(str.ToUpper()=="BYE")
break;
}
// 4. close
stream.Close();
client.Close();
}
catch (Exception ex) {
Console.WriteLine("Error: " + ex);
}
Console.Read();
}
}
Bạn chạy ví dụ này giống như ví dụ đầu tiên và gõ ‘exit’ vào client để thoát ứng dụng.
Dao Duy Thanh(I22B)- Tổng số bài gửi : 16
Join date : 13/03/2013
Age : 34
Re: Lập trình Socket
A Đào giỏi zữ ta
Huynh Xuan Dat(I22A)- Tổng số bài gửi : 25
Join date : 13/03/2013
Age : 34
Re: Lập trình Socket
that su nguong mo ban
LETHIANHDAO48(I22B)- Tổng số bài gửi : 21
Join date : 26/03/2013
LAP TRINH CLIENT-SERVER SU DUNG GIAO THUC UDP
+ Giao thuc UDP
- Khôngkết nối.
- không kiem tra loi, không đảm bảo sự chính xác của dữ liệu
- không đảm bảo thứ tự gửi/nhận gói
- phương pháp gửi/nhận dữ liệu là pp broadcast: dữ liệu đóng gói, gói lên mạng, hệ điều hành sẽ chịu trách nhiệm dưa gói đén đúng nơi nhận.
- một gói chứa các thông tin sau: ip,port cua may gọi; ip,port cua may nhan; du lieu và một số thông tin khác.
- khi cần sự chinh xác cao và đảm bảo thứ tự goi/nhan dữ liệu thì dùng tcp; khi cần thực hiện nhanh, ít tốn tài nguyên, không cần sự chính xác cao, không cần đảm bảo thứ tự goi/nhan dữ liệu thì dùng udp.
vi du: dich vụ hổi thời tiết dung giao thuc udp la phù hợp.
- server udp kg can tao thread, va chi can mot socket de lien lac voi tat ca cac client.
- client phai goi truoc, nhan sau; server thì nhận trước, gữi sau. client phai biet ip,port cua server.
+ Viet ung dung UDP
- Ct client: gữi gói chứa yêu cầu lên server va nhận gói chứa kết qủa do server gủi
import java.io.*;
import java.net.*;
public class Client
{
public static void main(String[] args) throws IOException
{
DatagramSocket cs = new DatagramSocket();//mo mot socket dung de goi/nhan goi voi server
byte[] obuf = "chuoi du lieu can goi";//chuoi dl goi cho server luu vao mang obuf
InetAddress addS = InetAddress.getByName("ten_server'); //lay dia chi cua server
//tao goi opacket chua dl can goi cho server
DatagramPacket opacket = new DatagramPacket(obuf, obuf.length, addS,1234);//1234 la port server sd
cs.send(opacket);//goi goi opacket cho server
byte[] ibuf =new byte [512];//tao mang kieu byte de chua ket qua
DatagramPacket ipacket = new DatagramPacket(ibuf, ibuf.length);//tao mot goi rong
cs.receive(ipacket);//nhan goi ket qua
//lay ket qua trong goi va doi sang kieu chuoi
String strResult = new String(ipacket.getData()).trim();//trim la cat bo cac ky tu trang o hai dau
//các lệnh xử lý dữ liệu
cs.close();//dong socket truoc khi client ket thuc
}
}
+ Ct server:
import java.io.*;
import java.net.*;
public class Server
{
public static void main(String[] args) throws IOException
{ //mo socket tai cong 1234, server dung socket nay de goi/nhan goi voi tat ca client
DatagramSocket ss = new DatagramSocket(1234);
while (true) //dung vong lap vo han de lien tuc nhan cac goi do cac client goi len
{ byte[] ibuf =new byte [512];//tao mang kieu byte de chua du lieu do client goi
DatagramPacket ipacket = new DatagramPacket(ibuf, ibuf.length);//tao mot goi rong
ss.receive(ipacket);//nhan goi do client goi
new ServerThread(ss,ipacket).start();//tao thread xu ly goi do client goi
}
}
}
class ServerThread extends Thread
{ DatagramSocket ss; DatagramPacket ipacket;
public ServerThread(DatagramSocket ss,DatagramPacket ipacket)
{ this.ss=ss; this.ipacket=ipacket; }
public void run()
{ //lay du lieu trong goi va doi sang kieu chuoi
String str = new String(ipacket.getData()).trim();//trim la cat bo cac ky tu trang o hai dau
//các lệnh xử lý dữ liệu do client goi
byte[] obuf = "chuoi ket qua";//chuoi ket qua se duoc goi cho client luu vao mang obuf
InetAddress addC =ipacket.getAddress();//lay dia chi client
int portC = ipacket.getPort();//lay port cua client
//tao goi opacket chua dl can goi cho server
DatagramPacket opacket = new DatagramPacket(obuf, obuf.length, addC,portC);
ss.send(opacket);//goi goi opacket cho client
}
}
Ý Tưởng:
ma tinh/tp nhiet do do am
hcm 34-38 10%
hn 30-36 20%
camau 32-39 15%
vv…
Ghi chu: ma tinh/tp co the cho client chon trong hop select, ds ma tinh hien ra trong hop la do server goi cho client.
Đây là File upload code viết bằng java. http://www.mediafire.com/?frtlbidizwruef4
- Khôngkết nối.
- không kiem tra loi, không đảm bảo sự chính xác của dữ liệu
- không đảm bảo thứ tự gửi/nhận gói
- phương pháp gửi/nhận dữ liệu là pp broadcast: dữ liệu đóng gói, gói lên mạng, hệ điều hành sẽ chịu trách nhiệm dưa gói đén đúng nơi nhận.
- một gói chứa các thông tin sau: ip,port cua may gọi; ip,port cua may nhan; du lieu và một số thông tin khác.
- khi cần sự chinh xác cao và đảm bảo thứ tự goi/nhan dữ liệu thì dùng tcp; khi cần thực hiện nhanh, ít tốn tài nguyên, không cần sự chính xác cao, không cần đảm bảo thứ tự goi/nhan dữ liệu thì dùng udp.
vi du: dich vụ hổi thời tiết dung giao thuc udp la phù hợp.
- server udp kg can tao thread, va chi can mot socket de lien lac voi tat ca cac client.
- client phai goi truoc, nhan sau; server thì nhận trước, gữi sau. client phai biet ip,port cua server.
+ Viet ung dung UDP
- Ct client: gữi gói chứa yêu cầu lên server va nhận gói chứa kết qủa do server gủi
import java.io.*;
import java.net.*;
public class Client
{
public static void main(String[] args) throws IOException
{
DatagramSocket cs = new DatagramSocket();//mo mot socket dung de goi/nhan goi voi server
byte[] obuf = "chuoi du lieu can goi";//chuoi dl goi cho server luu vao mang obuf
InetAddress addS = InetAddress.getByName("ten_server'); //lay dia chi cua server
//tao goi opacket chua dl can goi cho server
DatagramPacket opacket = new DatagramPacket(obuf, obuf.length, addS,1234);//1234 la port server sd
cs.send(opacket);//goi goi opacket cho server
byte[] ibuf =new byte [512];//tao mang kieu byte de chua ket qua
DatagramPacket ipacket = new DatagramPacket(ibuf, ibuf.length);//tao mot goi rong
cs.receive(ipacket);//nhan goi ket qua
//lay ket qua trong goi va doi sang kieu chuoi
String strResult = new String(ipacket.getData()).trim();//trim la cat bo cac ky tu trang o hai dau
//các lệnh xử lý dữ liệu
cs.close();//dong socket truoc khi client ket thuc
}
}
+ Ct server:
import java.io.*;
import java.net.*;
public class Server
{
public static void main(String[] args) throws IOException
{ //mo socket tai cong 1234, server dung socket nay de goi/nhan goi voi tat ca client
DatagramSocket ss = new DatagramSocket(1234);
while (true) //dung vong lap vo han de lien tuc nhan cac goi do cac client goi len
{ byte[] ibuf =new byte [512];//tao mang kieu byte de chua du lieu do client goi
DatagramPacket ipacket = new DatagramPacket(ibuf, ibuf.length);//tao mot goi rong
ss.receive(ipacket);//nhan goi do client goi
new ServerThread(ss,ipacket).start();//tao thread xu ly goi do client goi
}
}
}
class ServerThread extends Thread
{ DatagramSocket ss; DatagramPacket ipacket;
public ServerThread(DatagramSocket ss,DatagramPacket ipacket)
{ this.ss=ss; this.ipacket=ipacket; }
public void run()
{ //lay du lieu trong goi va doi sang kieu chuoi
String str = new String(ipacket.getData()).trim();//trim la cat bo cac ky tu trang o hai dau
//các lệnh xử lý dữ liệu do client goi
byte[] obuf = "chuoi ket qua";//chuoi ket qua se duoc goi cho client luu vao mang obuf
InetAddress addC =ipacket.getAddress();//lay dia chi client
int portC = ipacket.getPort();//lay port cua client
//tao goi opacket chua dl can goi cho server
DatagramPacket opacket = new DatagramPacket(obuf, obuf.length, addC,portC);
ss.send(opacket);//goi goi opacket cho client
}
}
Ý Tưởng:
ma tinh/tp nhiet do do am
hcm 34-38 10%
hn 30-36 20%
camau 32-39 15%
vv…
Ghi chu: ma tinh/tp co the cho client chon trong hop select, ds ma tinh hien ra trong hop la do server goi cho client.
Đây là File upload code viết bằng java. http://www.mediafire.com/?frtlbidizwruef4
BuiHuuDang(I22B)- Tổng số bài gửi : 14
Join date : 13/03/2013
Re: Lập trình Socket
Đây là bài CHAT TCP-Private chạy trên nền WindowForm sử dụng Socket, Đa Luồng và xử lý bất đồng bộ.
Server: Chạy bằng Console Application
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Collections;
using System.Net.Sockets;
using System.Threading;
namespace PrivateChatTCPServer
{
class Program
{
static ArrayList clientList = new ArrayList();//1 mang chua cac clientsocket
static ArrayList accountList = new ArrayList();//1 mang chua thong tin cac client
static void ReceiveData()
{
int recv;
byte[] data;
string[] strArr;
string strData, message, address, port;
IPEndPoint ipep;
ArrayList copyList;
while (true)
{
if (clientList.Count != 0)
{
copyList = new ArrayList(clientList);
//add cac client moi gui message vao copyList
Socket.Select(copyList, null, null, 10000000);
foreach (Socket client in copyList)
{
data = new byte[1024];
recv = client.Receive(data);
strData = Encoding.ASCII.GetString(data, 0, recv);
if (strData != "exit")
{
strArr = strData.Split('*');
message = strArr[0];
address = strArr[1];
port = strArr[2];
ipep = new IPEndPoint(IPAddress.Parse(address), Int16.Parse(port));
//gui message toi client dich
foreach (Socket sock in clientList)
{
if (sock.RemoteEndPoint.Equals(ipep))
sock.Send(Encoding.ASCII.GetBytes(message));
}
}
else//client disconnect
{
ipep = (IPEndPoint)client.RemoteEndPoint;
Console.WriteLine("Client {0} disconnected.", ipep.ToString());
clientList.Remove(client);
foreach (Account acc in accountList)
{
if (client.RemoteEndPoint.Equals(acc.EndPoint))
{
accountList.Remove(acc);
break;
}
}
client.Close();
//cap nhat thong tin client cho cac client
updateClient(clientList, accountList);
} } } } }
static void Main()
{
int recv;
bool found;
byte[] data;
Account user;
string nickName;
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);
Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
newsock.Bind(ipep);
newsock.Listen(10);
Console.WriteLine("Waiting for a client...");
//tao va start 1 luong
Thread newThread = new Thread(new ThreadStart(ReceiveData));
newThread.Start();
while (true)
{
Socket client = newsock.Accept();
IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
data = new byte[1024];
recv = client.Receive(data);
nickName = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine("{0} connected with {1}:{2}", nickName, clientep.Address, clientep.Port);
found = false;
//kiem tra xem client moi ket noi da co trong clientList chua
foreach (Socket sock in clientList)
{
if (sock.Equals(client))
{
found = true;
break;
}
}
//neu chua co thi add vao clientList
if (!found)
{
user = new Account();
user.NickName = nickName;
user.EndPoint = clientep;
clientList.Add(client);
accountList.Add(user);
//cap nhat thong tin client cho cac client
updateClient(clientList, accountList);
} } }
static void updateClient(ArrayList clientList, ArrayList accountList)
{
IPEndPoint endPoint;
string address, port, userInfo;
string userList = "*";
//tap hop thong tin client dang ket noi
foreach (Account acc in accountList)
{
endPoint = (IPEndPoint)acc.EndPoint;
address = endPoint.Address.ToString();
port = endPoint.Port.ToString();
userInfo = acc.NickName + " " + address + " " + port;
userList += userInfo + "*";
}
//gui danh sach tat ca client da ket noi den tung client
foreach (Socket sock in clientList)
sock.Send(Encoding.ASCII.GetBytes(userList));
}
}
//dat class nay o duoi class Program
//tao 1 lop Account chua ten nick va endpoint cua client
class Account
{
public string NickName;
public IPEndPoint EndPoint;
public Account()
{
NickName = null;
EndPoint = null;
}
}
}
CLIENT chạy bằng Windows Application
https://2img.net/r/ihimg/photo/my-images/16/clientj.png/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Collections;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
namespace PrivateChatTCPClient
{
public partial class Form1 : Form
{
int size = 1024;
Socket server;
bool connect = true;
string nickName;
byte[] dataRecv = new byte[1024];
ArrayList accountList;
public Form1()
{
InitializeComponent();
}
void SendData(IAsyncResult iar)
{
Socket remote = (Socket)iar.AsyncState;
int sent = remote.EndSend(iar);
}
void ReceiveData(IAsyncResult iar)
{
if (connect)
{
Socket remote = (Socket)iar.AsyncState;
int recv = remote.EndReceive(iar);
string message = Encoding.ASCII.GetString(dataRecv, 0, recv);
if (message.Substring(0, 1) != "*")
listMessage.Items.Add(message);
else//cap nhat friend list
{
Account account;
IPEndPoint ipep;
accountList = new ArrayList();
string[] info;
//tach thong tin client tu server gui toi luu vao mang clientInfo
string[] clientInfo = message.Split('*');
//duyet mang clientInfo, tach thong tin tung client: nickname, address, port
//luu vao bien doi tuong account sau do luu bien account vao clientList
foreach (string str in clientInfo)
{
if (str != "")
{
info = str.Split(' ');
ipep = new IPEndPoint(IPAddress.Parse(info[1]), Int16.Parse(info[2]));
account = new Account();
account.NickName = info[0];
account.EndPoint = ipep;
accountList.Add(account);
}
}
//duyet accountList, add danh sach client vao combobox
cmbFriends.Items.Clear();
foreach (Account acc in accountList)
{
if (acc.NickName != nickName)
cmbFriends.Items.Add(acc.NickName);
} }
//goi lai phuong thuc ReceiveData de cho nhan du lieu
remote.BeginReceive(dataRecv, 0, size, SocketFlags.None,new AsyncCallback(ReceiveData), remote);
} }
private void btnConnect_Click(object sender, EventArgs e)
{
if (txtNickName.Text.Trim() != "")
{
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050);
server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
server.Connect(ipep);
listMessage.Items.Add("Connected to Server");
btnConnect.Enabled = false;
btnDisconnect.Enabled = true;
nickName = txtNickName.Text.Trim();
byte[] dataSend = Encoding.ASCII.GetBytes(nickName);
server.BeginSend(dataSend, 0, dataSend.Length, SocketFlags.None,
new AsyncCallback(SendData), server);
//goi phuong thuc ReceiveData de cho nhan du lieu
server.BeginReceive(dataRecv, 0, size, SocketFlags.None,
new AsyncCallback(ReceiveData), server);
}
catch
{
MessageBox.Show("Unable to connect to server", "Information",
MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
}
else
{
txtNickName.Focus();
MessageBox.Show("Please enter your Nick Name", "Information",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void btnSend_Click(object sender, EventArgs e)
{
if (cmbFriends.SelectedIndex != -1)
{
if (txtMessage.Text.Trim() != "")
{
//gui message den client duoc chon trong combobox
foreach (Account acc in accountList)
{
if (acc.NickName == cmbFriends.SelectedItem.ToString())
{
IPEndPoint ipep = (IPEndPoint)acc.EndPoint;
byte[] dataSend = Encoding.ASCII.GetBytes(nickName + ": " + txtMessage.Text.Trim() +
"*" + ipep.Address + "*" + ipep.Port);
server.BeginSend(dataSend, 0, dataSend.Length, SocketFlags.None,
new AsyncCallback(SendData), server);
listMessage.Items.Add(nickName + ": " + txtMessage.Text.Trim());
txtMessage.Clear();
txtMessage.Focus();
break;
}
}
}
else
{
txtMessage.Focus();
MessageBox.Show("Please enter a message", "Information",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
else
MessageBox.Show("Please choose your friend", "Information",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
private void btnDisconnect_Click(object sender, EventArgs e)
{
btnConnect.Enabled = true;
btnDisconnect.Enabled = false;
cmbFriends.Items.Clear();
byte[] dataSend = Encoding.ASCII.GetBytes("exit");
server.BeginSend(dataSend, 0, dataSend.Length, SocketFlags.None,
new AsyncCallback(SendData), server);
listMessage.Items.Add("Disconnected from server");
connect = false;
}
}
//dat class nay o duoi class Program
//tao 1 lop Account chua ten nick va endpoint cua client
class Account
{
public string NickName;
public IPEndPoint EndPoint;
public Account()
{
NickName = null;
EndPoint = null;
} }}
Server: Chạy bằng Console Application
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Collections;
using System.Net.Sockets;
using System.Threading;
namespace PrivateChatTCPServer
{
class Program
{
static ArrayList clientList = new ArrayList();//1 mang chua cac clientsocket
static ArrayList accountList = new ArrayList();//1 mang chua thong tin cac client
static void ReceiveData()
{
int recv;
byte[] data;
string[] strArr;
string strData, message, address, port;
IPEndPoint ipep;
ArrayList copyList;
while (true)
{
if (clientList.Count != 0)
{
copyList = new ArrayList(clientList);
//add cac client moi gui message vao copyList
Socket.Select(copyList, null, null, 10000000);
foreach (Socket client in copyList)
{
data = new byte[1024];
recv = client.Receive(data);
strData = Encoding.ASCII.GetString(data, 0, recv);
if (strData != "exit")
{
strArr = strData.Split('*');
message = strArr[0];
address = strArr[1];
port = strArr[2];
ipep = new IPEndPoint(IPAddress.Parse(address), Int16.Parse(port));
//gui message toi client dich
foreach (Socket sock in clientList)
{
if (sock.RemoteEndPoint.Equals(ipep))
sock.Send(Encoding.ASCII.GetBytes(message));
}
}
else//client disconnect
{
ipep = (IPEndPoint)client.RemoteEndPoint;
Console.WriteLine("Client {0} disconnected.", ipep.ToString());
clientList.Remove(client);
foreach (Account acc in accountList)
{
if (client.RemoteEndPoint.Equals(acc.EndPoint))
{
accountList.Remove(acc);
break;
}
}
client.Close();
//cap nhat thong tin client cho cac client
updateClient(clientList, accountList);
} } } } }
static void Main()
{
int recv;
bool found;
byte[] data;
Account user;
string nickName;
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);
Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
newsock.Bind(ipep);
newsock.Listen(10);
Console.WriteLine("Waiting for a client...");
//tao va start 1 luong
Thread newThread = new Thread(new ThreadStart(ReceiveData));
newThread.Start();
while (true)
{
Socket client = newsock.Accept();
IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
data = new byte[1024];
recv = client.Receive(data);
nickName = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine("{0} connected with {1}:{2}", nickName, clientep.Address, clientep.Port);
found = false;
//kiem tra xem client moi ket noi da co trong clientList chua
foreach (Socket sock in clientList)
{
if (sock.Equals(client))
{
found = true;
break;
}
}
//neu chua co thi add vao clientList
if (!found)
{
user = new Account();
user.NickName = nickName;
user.EndPoint = clientep;
clientList.Add(client);
accountList.Add(user);
//cap nhat thong tin client cho cac client
updateClient(clientList, accountList);
} } }
static void updateClient(ArrayList clientList, ArrayList accountList)
{
IPEndPoint endPoint;
string address, port, userInfo;
string userList = "*";
//tap hop thong tin client dang ket noi
foreach (Account acc in accountList)
{
endPoint = (IPEndPoint)acc.EndPoint;
address = endPoint.Address.ToString();
port = endPoint.Port.ToString();
userInfo = acc.NickName + " " + address + " " + port;
userList += userInfo + "*";
}
//gui danh sach tat ca client da ket noi den tung client
foreach (Socket sock in clientList)
sock.Send(Encoding.ASCII.GetBytes(userList));
}
}
//dat class nay o duoi class Program
//tao 1 lop Account chua ten nick va endpoint cua client
class Account
{
public string NickName;
public IPEndPoint EndPoint;
public Account()
{
NickName = null;
EndPoint = null;
}
}
}
CLIENT chạy bằng Windows Application
https://2img.net/r/ihimg/photo/my-images/16/clientj.png/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Collections;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
namespace PrivateChatTCPClient
{
public partial class Form1 : Form
{
int size = 1024;
Socket server;
bool connect = true;
string nickName;
byte[] dataRecv = new byte[1024];
ArrayList accountList;
public Form1()
{
InitializeComponent();
}
void SendData(IAsyncResult iar)
{
Socket remote = (Socket)iar.AsyncState;
int sent = remote.EndSend(iar);
}
void ReceiveData(IAsyncResult iar)
{
if (connect)
{
Socket remote = (Socket)iar.AsyncState;
int recv = remote.EndReceive(iar);
string message = Encoding.ASCII.GetString(dataRecv, 0, recv);
if (message.Substring(0, 1) != "*")
listMessage.Items.Add(message);
else//cap nhat friend list
{
Account account;
IPEndPoint ipep;
accountList = new ArrayList();
string[] info;
//tach thong tin client tu server gui toi luu vao mang clientInfo
string[] clientInfo = message.Split('*');
//duyet mang clientInfo, tach thong tin tung client: nickname, address, port
//luu vao bien doi tuong account sau do luu bien account vao clientList
foreach (string str in clientInfo)
{
if (str != "")
{
info = str.Split(' ');
ipep = new IPEndPoint(IPAddress.Parse(info[1]), Int16.Parse(info[2]));
account = new Account();
account.NickName = info[0];
account.EndPoint = ipep;
accountList.Add(account);
}
}
//duyet accountList, add danh sach client vao combobox
cmbFriends.Items.Clear();
foreach (Account acc in accountList)
{
if (acc.NickName != nickName)
cmbFriends.Items.Add(acc.NickName);
} }
//goi lai phuong thuc ReceiveData de cho nhan du lieu
remote.BeginReceive(dataRecv, 0, size, SocketFlags.None,new AsyncCallback(ReceiveData), remote);
} }
private void btnConnect_Click(object sender, EventArgs e)
{
if (txtNickName.Text.Trim() != "")
{
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050);
server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
server.Connect(ipep);
listMessage.Items.Add("Connected to Server");
btnConnect.Enabled = false;
btnDisconnect.Enabled = true;
nickName = txtNickName.Text.Trim();
byte[] dataSend = Encoding.ASCII.GetBytes(nickName);
server.BeginSend(dataSend, 0, dataSend.Length, SocketFlags.None,
new AsyncCallback(SendData), server);
//goi phuong thuc ReceiveData de cho nhan du lieu
server.BeginReceive(dataRecv, 0, size, SocketFlags.None,
new AsyncCallback(ReceiveData), server);
}
catch
{
MessageBox.Show("Unable to connect to server", "Information",
MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
}
else
{
txtNickName.Focus();
MessageBox.Show("Please enter your Nick Name", "Information",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void btnSend_Click(object sender, EventArgs e)
{
if (cmbFriends.SelectedIndex != -1)
{
if (txtMessage.Text.Trim() != "")
{
//gui message den client duoc chon trong combobox
foreach (Account acc in accountList)
{
if (acc.NickName == cmbFriends.SelectedItem.ToString())
{
IPEndPoint ipep = (IPEndPoint)acc.EndPoint;
byte[] dataSend = Encoding.ASCII.GetBytes(nickName + ": " + txtMessage.Text.Trim() +
"*" + ipep.Address + "*" + ipep.Port);
server.BeginSend(dataSend, 0, dataSend.Length, SocketFlags.None,
new AsyncCallback(SendData), server);
listMessage.Items.Add(nickName + ": " + txtMessage.Text.Trim());
txtMessage.Clear();
txtMessage.Focus();
break;
}
}
}
else
{
txtMessage.Focus();
MessageBox.Show("Please enter a message", "Information",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
else
MessageBox.Show("Please choose your friend", "Information",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
private void btnDisconnect_Click(object sender, EventArgs e)
{
btnConnect.Enabled = true;
btnDisconnect.Enabled = false;
cmbFriends.Items.Clear();
byte[] dataSend = Encoding.ASCII.GetBytes("exit");
server.BeginSend(dataSend, 0, dataSend.Length, SocketFlags.None,
new AsyncCallback(SendData), server);
listMessage.Items.Add("Disconnected from server");
connect = false;
}
}
//dat class nay o duoi class Program
//tao 1 lop Account chua ten nick va endpoint cua client
class Account
{
public string NickName;
public IPEndPoint EndPoint;
public Account()
{
NickName = null;
EndPoint = null;
} }}
Được sửa bởi ChauQuangCam (I22B) ngày 30/3/2013, 14:11; sửa lần 1.
ChauQuangCam (I22B)- Tổng số bài gửi : 23
Join date : 11/03/2013
share tài liệu.
Đây là code viết bằng java và tài liệu java mà lap trình socket, mạng máy tính, kết nối cơ sỡ dữ liệu.bạn nào muốn học thêm về ngôn ngữ này thì tải về học thêm.
Có một số code mẫu, down về giải nến có thể chạy được bằng Jbuider 2006
Địa chỉ link download: http://www.mediafire.com/?86xqwran989antn
Có một số code mẫu, down về giải nến có thể chạy được bằng Jbuider 2006
Địa chỉ link download: http://www.mediafire.com/?86xqwran989antn
BuiHuuDang(I22B)- Tổng số bài gửi : 14
Join date : 13/03/2013
Lập trình Socket ( Ngôn ngữ C++)
Hầu như các trang web, hay những game hiện này đều có chức năng chat với nhau. Do đó lập trình socket là 1 cách khá phổ biến để thực hiện công việc trên. Các bạn có thể tìm kiếm chúng trên google, bing... Và đây, mình muốn chia sẽ với các bạn 1 link hướng dẫn lập trình socket bằng C++ mà mình cảm thấy rất hay. Nhưng trước tiên mình muốn giới thiệu chút ít về lập trình socket:
“Socket là một cổng logic mà một chương trình sử dụng để kết nối với một chương trình khác chạy trên một máy tính khác trên Internet. Chương trình mạng có thể sử dụng nhiều Socket cùng một lúc, nhờ đó nhiều chương trình có thể sử dụng Internet cùng một lúc.”
Ở đây ta hiểu Socket trong Winsock như là một “phương tiện” để ứng dụng mạng có thể trao đổi dữ liệu. Nghĩa là 1 Server thì sẽ cần một Socket để lắng nghe, chờ đợi các kết nối từ client và Client thì phải cần có một Socket để kết nối tới Sever.
Link hướng dẫn lập trình socket:
http://diendan.congdongcviet.com/showthread.php?t=7362
P/S: Chúc các bạn có thêm nhiều kiến thức về lập trình nhé!
“Socket là một cổng logic mà một chương trình sử dụng để kết nối với một chương trình khác chạy trên một máy tính khác trên Internet. Chương trình mạng có thể sử dụng nhiều Socket cùng một lúc, nhờ đó nhiều chương trình có thể sử dụng Internet cùng một lúc.”
Ở đây ta hiểu Socket trong Winsock như là một “phương tiện” để ứng dụng mạng có thể trao đổi dữ liệu. Nghĩa là 1 Server thì sẽ cần một Socket để lắng nghe, chờ đợi các kết nối từ client và Client thì phải cần có một Socket để kết nối tới Sever.
Link hướng dẫn lập trình socket:
http://diendan.congdongcviet.com/showthread.php?t=7362
P/S: Chúc các bạn có thêm nhiều kiến thức về lập trình nhé!
NguyenMinhTuan (I22B)- Tổng số bài gửi : 19
Join date : 08/03/2013
Re: Lập trình Socket
Bài hay, cảm ơn bạnBuiHuuDang(I22B) đã viết:+ Giao thuc UDP
- Khôngkết nối.
- không kiem tra loi, không đảm bảo sự chính xác của dữ liệu
- không đảm bảo thứ tự gửi/nhận gói
- phương pháp gửi/nhận dữ liệu là pp broadcast: dữ liệu đóng gói, gói lên mạng, hệ điều hành sẽ chịu trách nhiệm dưa gói đén đúng nơi nhận.
- một gói chứa các thông tin sau: ip,port cua may gọi; ip,port cua may nhan; du lieu và một số thông tin khác.
- khi cần sự chinh xác cao và đảm bảo thứ tự goi/nhan dữ liệu thì dùng tcp; khi cần thực hiện nhanh, ít tốn tài nguyên, không cần sự chính xác cao, không cần đảm bảo thứ tự goi/nhan dữ liệu thì dùng udp.
vi du: dich vụ hổi thời tiết dung giao thuc udp la phù hợp.
- server udp kg can tao thread, va chi can mot socket de lien lac voi tat ca cac client.
- client phai goi truoc, nhan sau; server thì nhận trước, gữi sau. client phai biet ip,port cua server.
//....
Đây là File upload code viết bằng java. http://www.mediafire.com/?frtlbidizwruef4
Help me! :bounce:
Tiện đây cho mình hỏi có cách nào để gửi 1 thông điệp poup đến các máy trong mạng lan không ?
Huynh Xuan Dat(I22A)- Tổng số bài gửi : 25
Join date : 13/03/2013
Age : 34
Re: Lập trình Socket
TranBinhCongLuanI12A đã viết:Hi bạn,AnhDao(I22B) đã viết:Chào bạn !
Mình hỉu ý thứ 2 của bạn . Mình cũng đã trình bày ở ví dụ trên rồi , Nhưng vấn đề mình muốn mở rộng ra như sau :
+ Mình muốn dùng chỉ 1 câu trả lời duy nhất từ sever " chào em TCP1, TCP2, TCP3, ..., TCP100" , câu trả lời này được chuyển đến từng client
+ Nhưng khi client nhận dc ko phải là văn bản chung như trên. mà phải đúng với từng TCP
Cụ Thể : sever " chào em TCP1, TCP2, TCP3, ..., TCP100"
TCP1 nhận dc : " chào e TCP1 "
TCP2 nhận dc : " chào e TCP2 "
.....
TCP100 nhận dc : " chào e TCP100 "
+ Mình muốn chỉ 1 lần trả lời , nhưng nó tự tách ra ,tìm và trả lời đúng client của nó ....
Liệu có làm vậy dc k0?
Cảm ơn bạn nha .... hj
Khi client kết nối vào server thì server đã lưu được các thông tin của client rồi nên khi gởi nó sẽ đúng client.
vd: (Mô tả của mình dùng Code C# và làm việc trên cơ chế TCP/IP)
- Code:
struct ClientInfo
{
String UserName;
Socket client;
// Các thông tin khác nếu cần
}
List<ClientInfo> lstClient = new List<ClientInfo>();
// Mỗi khi Client kết nối thì thêm vào [b]lstClient[/b]
// Mỗi khi Client ngắt kết nối thì xóa khỏi [b]lstClient[/b]
//Khi server click gởi, duyệt danh sách lstClient để lấy Socket và tên của Client cần gởi
foreach (ClientInfo _sk in lstClient)
{
// Vì cơ chế TCP/IP gởi và nhận dữ liệu theo kiểu byte
byte[] buff = new byte[1024];
string text = "Xin chào: " + _sk.UserName;
// Chuyển chuỗi text sang dạng byte và gán vào biến buff
buff = TextToByte(text);// Hàm TextToByte phải tự viết
//Gởi tới client cụ thể thông qua socket ghi nhận trong lstClient
_sk.client.Send(buff, buff.Length, SocketFlags.None);
}
Chúc bạn thành công!
thanks bạn.
dangvandinhI22A- Tổng số bài gửi : 12
Join date : 12/04/2013
NetMeeting
AnhDao(I22B) đã viết:Thầy ơi , cho e hỏi
Như ví dụ thầy đưa lên bảng trong phần TCP sever --> tcpsever.exe và TCP Client -->tcpClient.exe ( double)
Ta kết nối 2 cổng TCP Client1 và TCP Client2 vào 1 cổng TCP Sever . Tiến trình như sau :
- TCP Client 1 nhập " Chào Thầy totuan1 " , nó sẽ hiện lên TCP Sever . Tương tự
- TCP Client 2 nhập " Chào Thầy totuan2 " , nó sẽ hiện lên TCP Sever
- TCP Sever click vào TCP Client1 trả lời " Chào e TCP1 " , nó sẽ hiện lên TCP Client 1 . Tương tự
- TCP Sever click vào TCP Client2 trả lời " Chào e TCP2 " , nó sẽ hiện lên TCP Client 2
Với chức năng, khi check vào nút Metiselect ( chọn nhiều , để có 1 câu trả lời , gửi đi nhiều nơi )
- Ta check vào TCP Client 1, TCP Client 2 , gửi " chào e TCP1 Và TCP2 ".
Nó hiện ra dòng văn bản trên TCP Client 1, TCP Client 2 là như nhau.
Giả sử , trong lớp I22B có 100 học sinh, đều chào Thầy như vậy, Thầy ko thể chọn từng TCPClient để trả lời từng bạn vì quá nhiều và tốn thời gian. Hoặc với dòng Văn bản " chào e TCP1 .... TCP100 " , nhiều bạn không muốn Thầy trả lời chung như vậy .
Vậy theo em, Thầy có cách nào để khi Nhập Văn bản vào.
"Chào e
TCP1
TCP2
....
TCP100"
Nhưng Khi hiện lên từng TCPClient của bạn nào , bạn ấy nhận được 1 lời chào đúng số TCPClient của bạn ấy . không hiển thị chung như trên ???
Liệu làm như vậy có được k0?
Câu hỏi hơi điên rồ , nhưng thực tế nhé . Thầy và các bạn cho e xin hướng giải quyết ạ .
Hình như trong Windows có chương trình NetMeeting.......bạn tìm hiểu thử xem....vào Run...gõ conf
DuongKhanhThanh(I22B)- Tổng số bài gửi : 24
Join date : 13/03/2013
Trang 2 trong tổng số 2 trang • 1, 2
Similar topics
» Lập trình socket
» Lập trình socket với UDP
» lập trình socket
» Lập trình Socket
» Mời các bạn tham khảo: Lập trình UDP Socket (tui sưu tầm)
» Lập trình socket với UDP
» lập trình socket
» Lập trình Socket
» Mời các bạn tham khảo: Lập trình UDP Socket (tui sưu tầm)
Trang 2 trong tổng số 2 trang
Permissions in this forum:
Bạn không có quyền trả lời bài viết