Elysia Tools

Browse tools, examples, visual explainers, and topic guides from one clear workspace.

Top Categories

Hubs

Language
ZHESPTRUFRDEEN

Elysia Tools

Navigation

Go

Web Networking Go Samples

Web Go networking examples including HTTP requests, HTTP servers, and TCP sockets

Samples

Entries inside this sample collection

CodegoSimple

HTTP Requests

Send GET/POST requests with headers, query parameters, and request/response handling

Difficulty

4/10

Estimated time

20 min

Tags

go, web, networking

Prerequisites

Basic Go, net/http package

go
// Web Go HTTP Requests Examples
// Sending HTTP GET/POST requests with proper handling

package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
	"net/url"
	"time"
)

// 1. Simple GET Request

// SimpleGet performs a simple HTTP GET request
func SimpleGet(url string) (string, error) {
	resp, err := http.Get(url)
	if err != nil {
		return "", fmt.Errorf("GET request failed: %v", err)
	}
	defer resp.Body.Close()

	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return "", fmt.Errorf("error reading response: %v", err)
	}

	if resp.StatusCode != http.StatusOK {
		return "", fmt.Errorf("unexpected status code: %d", resp.StatusCode)
	}

	return string(body), nil
}

// SimpleGetExample demonstrates simple GET request
func SimpleGetExample() {
	fmt.Println("--- Simple GET Request ---")

	url := "https://jsonplaceholder.typicode.com/posts/1"
	body, err := SimpleGet(url)
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}

	fmt.Printf("Response: %s\n", body)
}

// 2. GET Request with Headers

// GetWithHeaders performs GET request with custom headers
func GetWithHeaders(url string, headers map[string]string) (string, error) {
	req, err := http.NewRequest("GET", url, nil)
	if err != nil {
		return "", err
	}

	// Add headers
	for key, value := range headers {
		req.Header.Set(key, value)
	}

	client := &http.Client{Timeout: 10 * time.Second}
	resp, err := client.Do(req)
	if err != nil {
		return "", fmt.Errorf("request failed: %v", err)
	}
	defer resp.Body.Close()

	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return "", fmt.Errorf("error reading response: %v", err)
	}

	return string(body), nil
}

// GetWithHeadersExample demonstrates GET with headers
func GetWithHeadersExample() {
	fmt.Println("\n--- GET with Headers ---")

	url := "https://jsonplaceholder.typicode.com/posts/1"
	headers := map[string]string{
		"Accept":        "application/json",
		"User-Agent":    "MyGoApp/1.0",
		"Authorization": "Bearer token123",
	}

	body, err := GetWithHeaders(url, headers)
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}

	fmt.Printf("Response: %s\n", body)
}

// 3. GET Request with Query Parameters

// GetWithQueryParams performs GET with query parameters
func GetWithQueryParams(baseURL string, params map[string]string) (string, error) {
	// Build URL with query parameters
	u, err := url.Parse(baseURL)
	if err != nil {
		return "", err
	}

	query := u.Query()
	for key, value := range params {
		query.Set(key, value)
	}
	u.RawQuery = query.Encode()

	url = u.String()

	resp, err := http.Get(url)
	if err != nil {
		return "", fmt.Errorf("GET request failed: %v", err)
	}
	defer resp.Body.Close()

	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return "", fmt.Errorf("error reading response: %v", err)
	}

	return string(body), nil
}

// GetWithQueryParamsExample demonstrates GET with query parameters
func GetWithQueryParamsExample() {
	fmt.Println("\n--- GET with Query Parameters ---")

	baseURL := "https://jsonplaceholder.typicode.com/posts"
	params := map[string]string{
		"userId": "1",
		"_limit": "5",
	}

	body, err := GetWithQueryParams(baseURL, params)
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}

	fmt.Printf("Response: %s\n", body)
}

// 4. POST Request with JSON Body

// PostJSON sends a POST request with JSON body
func PostJSON(url string, data map[string]interface{}) (string, error) {
	jsonData, err := json.Marshal(data)
	if err != nil {
		return "", fmt.Errorf("error marshaling JSON: %v", err)
	}

	resp, err := http.Post(url, "application/json", bytes.NewBuffer(jsonData))
	if err != nil {
		return "", fmt.Errorf("POST request failed: %v", err)
	}
	defer resp.Body.Close()

	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return "", fmt.Errorf("error reading response: %v", err)
	}

	if resp.StatusCode != http.StatusCreated && resp.StatusCode != http.StatusOK {
		return "", fmt.Errorf("unexpected status code: %d", resp.StatusCode)
	}

	return string(body), nil
}

// PostJSONExample demonstrates POST with JSON
func PostJSONExample() {
	fmt.Println("\n--- POST JSON Request ---")

	url := "https://jsonplaceholder.typicode.com/posts"
	data := map[string]interface{}{
		"title":  "Test Post",
		"body":   "This is a test post",
		"userId": 1,
	}

	body, err := PostJSON(url, data)
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}

	fmt.Printf("Response: %s\n", body)
}

// 5. POST Request with Form Data

// PostForm sends a POST request with form data
func PostForm(url string, formData map[string]string) (string, error) {
	// Build form data
	values := url.Values{}
	for key, value := range formData {
		values.Set(key, value)
	}

	resp, err := http.PostForm(url, values)
	if err != nil {
		return "", fmt.Errorf("POST form request failed: %v", err)
	}
	defer resp.Body.Close()

	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return "", fmt.Errorf("error reading response: %v", err)
	}

	return string(body), nil
}

// PostFormExample demonstrates POST with form data
func PostFormExample() {
	fmt.Println("\n--- POST Form Request ---")

	url := "https://jsonplaceholder.typicode.com/posts"
	formData := map[string]string{
		"title":  "Test Form",
		"body":   "Form data content",
		"userId": "1",
	}

	body, err := PostForm(url, formData)
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}

	fmt.Printf("Response: %s\n", body)
}

// 6. PUT Request

// PutJSON sends a PUT request with JSON body
func PutJSON(url string, data map[string]interface{}) (string, error) {
	jsonData, err := json.Marshal(data)
	if err != nil {
		return "", fmt.Errorf("error marshaling JSON: %v", err)
	}

	req, err := http.NewRequest("PUT", url, bytes.NewBuffer(jsonData))
	if err != nil {
		return "", err
	}

	req.Header.Set("Content-Type", "application/json")

	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		return "", fmt.Errorf("PUT request failed: %v", err)
	}
	defer resp.Body.Close()

	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return "", fmt.Errorf("error reading response: %v", err)
	}

	return string(body), nil
}

// PutJSONExample demonstrates PUT request
func PutJSONExample() {
	fmt.Println("\n--- PUT Request ---")

	url := "https://jsonplaceholder.typicode.com/posts/1"
	data := map[string]interface{}{
		"id":     1,
		"title":  "Updated Post",
		"body":   "Updated content",
		"userId": 1,
	}

	body, err := PutJSON(url, data)
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}

	fmt.Printf("Response: %s\n", body)
}

// 7. DELETE Request

// DeleteResource sends a DELETE request
func DeleteResource(url string) (int, error) {
	req, err := http.NewRequest("DELETE", url, nil)
	if err != nil {
		return 0, err
	}

	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		return 0, fmt.Errorf("DELETE request failed: %v", err)
	}
	defer resp.Body.Close()

	return resp.StatusCode, nil
}

// DeleteRequestExample demonstrates DELETE request
func DeleteRequestExample() {
	fmt.Println("\n--- DELETE Request ---")

	url := "https://jsonplaceholder.typicode.com/posts/1"
	statusCode, err := DeleteResource(url)
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}

	fmt.Printf("Status Code: %d\n", statusCode)
}

// 8. Custom HTTP Client with Timeout

// HTTPClient represents a custom HTTP client
type HTTPClient struct {
	client      *http.Client
	baseURL     string
	defaultHeaders map[string]string
}

// NewHTTPClient creates a new HTTP client
func NewHTTPClient(timeout time.Duration) *HTTPClient {
	return &HTTPClient{
		client: &http.Client{
			Timeout: timeout,
		},
		defaultHeaders: make(map[string]string),
	}
}

// SetBaseURL sets the base URL for requests
func (c *HTTPClient) SetBaseURL(baseURL string) {
	c.baseURL = baseURL
}

// SetDefaultHeader sets a default header for all requests
func (c *HTTPClient) SetDefaultHeader(key, value string) {
	c.defaultHeaders[key] = value
}

// Get performs a GET request
func (c *HTTPClient) Get(path string) (string, error) {
	url := c.baseURL + path
	req, err := http.NewRequest("GET", url, nil)
	if err != nil {
		return "", err
	}

	// Add default headers
	for key, value := range c.defaultHeaders {
		req.Header.Set(key, value)
	}

	resp, err := c.client.Do(req)
	if err != nil {
		return "", fmt.Errorf("GET request failed: %v", err)
	}
	defer resp.Body.Close()

	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return "", fmt.Errorf("error reading response: %v", err)
	}

	if resp.StatusCode >= 400 {
		return "", fmt.Errorf("HTTP error: %d", resp.StatusCode)
	}

	return string(body), nil
}

// Post performs a POST request
func (c *HTTPClient) Post(path string, data map[string]interface{}) (string, error) {
	url := c.baseURL + path
	jsonData, err := json.Marshal(data)
	if err != nil {
		return "", err
	}

	req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
	if err != nil {
		return "", err
	}

	req.Header.Set("Content-Type", "application/json")

	// Add default headers
	for key, value := range c.defaultHeaders {
		if key != "Content-Type" {
			req.Header.Set(key, value)
		}
	}

	resp, err := c.client.Do(req)
	if err != nil {
		return "", fmt.Errorf("POST request failed: %v", err)
	}
	defer resp.Body.Close()

	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return "", fmt.Errorf("error reading response: %v", err)
	}

	if resp.StatusCode >= 400 {
		return "", fmt.Errorf("HTTP error: %d", resp.StatusCode)
	}

	return string(body), nil
}

// CustomClientExample demonstrates custom HTTP client
func CustomClientExample() {
	fmt.Println("\n--- Custom HTTP Client ---")

	client := NewHTTPClient(10 * time.Second)
	client.SetBaseURL("https://jsonplaceholder.typicode.com")
	client.SetDefaultHeader("User-Agent", "MyGoApp/1.0")

	// GET request
	body, err := client.Get("/posts/1")
	if err != nil {
		fmt.Printf("GET Error: %v\n", err)
		return
	}
	fmt.Printf("GET Response: %s\n", body)

	// POST request
	data := map[string]interface{}{
		"title":  "New Post",
		"body":   "Post content",
		"userId": 1,
	}

	body, err = client.Post("/posts", data)
	if err != nil {
		fmt.Printf("POST Error: %v\n", err)
		return
	}
	fmt.Printf("POST Response: %s\n", body)
}

// 9. Handling Response Headers

// GetWithResponseHeaders performs GET and returns headers
func GetWithResponseHeaders(url string) (string, http.Header, error) {
	resp, err := http.Get(url)
	if err != nil {
		return "", nil, err
	}
	defer resp.Body.Close()

	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return "", nil, err
	}

	return string(body), resp.Header, nil
}

// ResponseHeadersExample demonstrates reading response headers
func ResponseHeadersExample() {
	fmt.Println("\n--- Response Headers ---")

	url := "https://jsonplaceholder.typicode.com/posts/1"
	body, headers, err := GetWithResponseHeaders(url)
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}

	fmt.Println("Response Headers:")
	for key, values := range headers {
		for _, value := range values {
			fmt.Printf("  %s: %s\n", key, value)
		}
	}

	fmt.Printf("\nBody: %s\n", body)
}

// 10. Request with Context (Timeout)

// GetWithContext performs GET with context timeout
func GetWithContext(url string, timeout time.Duration) (string, error) {
	ctx, cancel := context.WithTimeout(context.Background(), timeout)
	defer cancel()

	req, err := http.NewRequestWithContext(ctx, "GET", url, nil)
	if err != nil {
		return "", err
	}

	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		return "", fmt.Errorf("request failed: %v", err)
	}
	defer resp.Body.Close()

	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return "", fmt.Errorf("error reading response: %v", err)
	}

	return string(body), nil
}

// ContextExample demonstrates context with timeout
func ContextExample() {
	fmt.Println("\n--- Request with Context Timeout ---")

	url := "https://jsonplaceholder.typicode.com/posts/1"

	body, err := GetWithContext(url, 5*time.Second)
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}

	fmt.Printf("Response: %s\n", body)
}

// Main function
func main() {
	fmt.Println("=== Web Go HTTP Requests Examples ===\n")

	SimpleGetExample()
	GetWithHeadersExample()
	GetWithQueryParamsExample()
	PostJSONExample()
	PostFormExample()
	PutJSONExample()
	DeleteRequestExample()
	CustomClientExample()
	ResponseHeadersExample()
	ContextExample()

	fmt.Println("\n=== All HTTP Request Examples Completed ===")
}
CodegoIntermediate

HTTP Server

Create simple HTTP servers with routing, handlers, and middleware

Difficulty

6/10

Estimated time

25 min

Tags

go, web, networking

Prerequisites

Intermediate Go, net/http package

go
// Web Go HTTP Server Examples
// Creating HTTP servers with routing and handlers

package main

import (
	"context"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"strings"
	"time"
)

// 1. Basic HTTP Server

// BasicHTTPServer demonstrates a simple HTTP server
func BasicHTTPServerExample() {
	fmt.Println("--- Basic HTTP Server ---")

	// Define handler
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "Hello, World!\n")
		fmt.Fprintf(w, "Path: %s\n", r.URL.Path)
		fmt.Fprintf(w, "Method: %s\n", r.Method)
	})

	http.HandleFunc("/about", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "About Page\n")
	})

	http.HandleFunc("/contact", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "Contact Page\n")
	})

	fmt.Println("Server starting on http://localhost:8080")
	// In real usage: log.Fatal(http.ListenAndServe(":8080", nil))
	fmt.Println("(Server would run here)")
}

// 2. Server with Custom ServeMux

// CustomServeMuxExample demonstrates using custom ServeMux
func CustomServeMuxExample() {
	fmt.Println("\n--- Custom ServeMux ---")

	mux := http.NewServeMux()

	mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "Home Page\n")
	})

	mux.HandleFunc("/api", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "API Endpoint\n")
	})

	mux.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {
		w.Header().Set("Content-Type", "application/json")
		json.NewEncoder(w).Encode(map[string]string{"status": "healthy"})
	})

	server := &http.Server{
		Addr:    ":8080",
		Handler: mux,
	}

	fmt.Println("Server configured on :8080")
	// In real usage: log.Fatal(server.ListenAndServe())
	fmt.Println("(Server would run here)")
}

// 3. RESTful API Server

// Post represents a blog post
type Post struct {
	ID     int    `json:"id"`
	Title  string `json:"title"`
	Body   string `json:"body"`
	UserID int    `json:"userId"`
}

var posts = []Post{
	{ID: 1, Title: "First Post", Body: "Content 1", UserID: 1},
	{ID: 2, Title: "Second Post", Body: "Content 2", UserID: 1},
}

// RestfulAPIServer demonstrates RESTful API server
func RestfulAPIServerExample() {
	fmt.Println("\n--- RESTful API Server ---")

	mux := http.NewServeMux()

	// GET /posts - get all posts
	mux.HandleFunc("/posts", func(w http.ResponseWriter, r *http.Request) {
		if r.Method == http.MethodGet {
			w.Header().Set("Content-Type", "application/json")
			json.NewEncoder(w).Encode(posts)
		} else {
			http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
		}
	})

	// GET /posts/{id} - get single post
	mux.HandleFunc("/posts/", func(w http.ResponseWriter, r *http.Request) {
		if r.Method == http.MethodGet {
			// Extract ID from URL path
			idStr := strings.TrimPrefix(r.URL.Path, "/posts/")
			var id int
			fmt.Sscanf(idStr, "%d", &id)

			for _, post := range posts {
				if post.ID == id {
					w.Header().Set("Content-Type", "application/json")
					json.NewEncoder(w).Encode(post)
					return
				}
			}

			http.Error(w, "Post not found", http.StatusNotFound)
		} else {
			http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
		}
	})

	// POST /posts - create new post
	mux.HandleFunc("/posts/create", func(w http.ResponseWriter, r *http.Request) {
		if r.Method == http.MethodPost {
			var newPost Post
			err := json.NewDecoder(r.Body).Decode(&newPost)
			if err != nil {
				http.Error(w, "Invalid request body", http.StatusBadRequest)
				return
			}

			newPost.ID = len(posts) + 1
			posts = append(posts, newPost)

			w.Header().Set("Content-Type", "application/json")
			w.WriteHeader(http.StatusCreated)
			json.NewEncoder(w).Encode(newPost)
		} else {
			http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
		}
	})

	fmt.Println("RESTful API Server configured")
	// In real usage: log.Fatal(http.ListenAndServe(":8080", mux))
	fmt.Println("(Server would run here)")
}

// 4. Server with Middleware

// LoggerMiddleware logs all requests
func LoggerMiddleware(next http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		start := time.Now()
		fmt.Printf("[%s] %s %s\n", start.Format("2006-01-02 15:04:05"), r.Method, r.URL.Path)

		// Call next handler
		next.ServeHTTP(w, r)

		fmt.Printf("Completed in %v\n", time.Since(start))
	})
}

// CORSMiddleware adds CORS headers
func CORSMiddleware(next http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		w.Header().Set("Access-Control-Allow-Origin", "*")
		w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
		w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization")

		if r.Method == "OPTIONS" {
			w.WriteHeader(http.StatusOK)
			return
		}

		next.ServeHTTP(w, r)
	})
}

// AuthMiddleware validates authentication
func AuthMiddleware(next http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		token := r.Header.Get("Authorization")

		if token == "" {
			http.Error(w, "Unauthorized", http.StatusUnauthorized)
			return
		}

		if token != "Bearer valid-token" {
			http.Error(w, "Forbidden", http.StatusForbidden)
			return
		}

		next.ServeHTTP(w, r)
	})
}

// MiddlewareServerExample demonstrates server with middleware
func MiddlewareServerExample() {
	fmt.Println("\n--- Server with Middleware ---")

	mux := http.NewServeMux()

	mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "Public endpoint\n")
	})

	mux.HandleFunc("/protected", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "Protected endpoint\n")
	})

	// Wrap middleware
	handler := CORSMiddleware(LoggerMiddleware(mux))

	server := &http.Server{
		Addr:    ":8080",
		Handler: handler,
	}

	fmt.Println("Server with middleware configured")
	// In real usage: log.Fatal(server.ListenAndServe())
	fmt.Println("(Server would run here)")
}

// 5. Server with Query Parameters

// QueryParamsServer demonstrates handling query parameters
func QueryParamsServerExample() {
	fmt.Println("\n--- Server with Query Parameters ---")

	mux := http.NewServeMux()

	mux.HandleFunc("/search", func(w http.ResponseWriter, r *http.Request) {
		query := r.URL.Query()
		keyword := query.Get("q")
		page := query.Get("page")
		limit := query.Get("limit")

		result := map[string]interface{}{
			"keyword": keyword,
			"page":    page,
			"limit":   limit,
			"results": []string{"Result 1", "Result 2", "Result 3"},
		}

		w.Header().Set("Content-Type", "application/json")
		json.NewEncoder(w).Encode(result)
	})

	fmt.Println("Server with query parameters configured")
}

// 6. Static File Server

// StaticFileServerExample demonstrates serving static files
func StaticFileServerExample() {
	fmt.Println("\n--- Static File Server ---")

	mux := http.NewServeMux()

	// Serve static files from ./static directory
	fs := http.FileServer(http.Dir("./static"))
	mux.Handle("/static/", http.StripPrefix("/static/", fs))

	mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "Welcome! Static files at /static/\n")
	})

	fmt.Println("Static file server configured")
	// In real usage: log.Fatal(http.ListenAndServe(":8080", mux))
}

// 7. Server with Graceful Shutdown

// GracefulShutdownExample demonstrates graceful shutdown
func GracefulShutdownExample() {
	fmt.Println("\n--- Graceful Shutdown ---")

	mux := http.NewServeMux()

	mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "Server running\n")
	})

	server := &http.Server{
		Addr:    ":8080",
		Handler: mux,
	}

	// Start server in goroutine
	go func() {
		fmt.Println("Server starting...")
		// In real usage: if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
		// 	log.Fatal(err)
		// }
	}()

	// Simulate graceful shutdown
	time.Sleep(1 * time.Second)

	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()

	fmt.Println("Shutting down server...")
	// In real usage: if err := server.Shutdown(ctx); err != nil {
	// 	log.Printf("Server shutdown error: %v", err)
	// }

	fmt.Println("Server gracefully stopped")
}

// 8. JSON Request/Response Handler

// User represents a user
type User struct {
	Name  string `json:"name"`
	Email string `json:"email"`
}

// JSONHandlerExample demonstrates JSON handling
func JSONHandlerExample() {
	fmt.Println("\n--- JSON Request/Response Handler ---")

	mux := http.NewServeMux()

	mux.HandleFunc("/api/user", func(w http.ResponseWriter, r *http.Request) {
		switch r.Method {
		case http.MethodPost:
			var user User
			err := json.NewDecoder(r.Body).Decode(&user)
			if err != nil {
				http.Error(w, "Invalid JSON", http.StatusBadRequest)
				return
			}

			w.Header().Set("Content-Type", "application/json")
			w.WriteHeader(http.StatusCreated)
			json.NewEncoder(w).Encode(map[string]interface{}{
				"message": "User created",
				"user":    user,
			})

		default:
			http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
		}
	})

	fmt.Println("JSON handler configured")
}

// 9. File Upload Handler

// FileUploadExample demonstrates file upload handling
func FileUploadExample() {
	fmt.Println("\n--- File Upload Handler ---")

	mux := http.NewServeMux()

	mux.HandleFunc("/upload", func(w http.ResponseWriter, r *http.Request) {
		if r.Method != http.MethodPost {
			http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
			return
		}

		// Parse multipart form (max 10MB)
		err := r.ParseMultipartForm(10 << 20)
		if err != nil {
			http.Error(w, "Unable to parse form", http.StatusBadRequest)
			return
		}

		// Get file from form
		file, handler, err := r.FormFile("file")
		if err != nil {
			http.Error(w, "Error retrieving file", http.StatusBadRequest)
			return
		}
		defer file.Close()

		fmt.Printf("Uploaded file: %s (%d bytes)\n", handler.Filename, handler.Size)

		// Read file content
		fileBytes, err := ioutil.ReadAll(file)
		if err != nil {
			http.Error(w, "Error reading file", http.StatusInternalServerError)
			return
		}

		w.WriteHeader(http.StatusOK)
		fmt.Fprintf(w, "File uploaded successfully: %s (%d bytes)\n", handler.Filename, len(fileBytes))
	})

	fmt.Println("File upload handler configured")
}

// 10. Server with TLS/HTTPS

// HTTPSServerExample demonstrates HTTPS server
func HTTPSServerExample() {
	fmt.Println("\n--- HTTPS Server ---")

	mux := http.NewServeMux()

	mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "Secure connection!\n")
	})

	// Server configuration
	server := &http.Server{
		Addr:    ":8443",
		Handler: mux,
	}

	fmt.Println("HTTPS server configured on :8443")
	// In real usage:
	// log.Fatal(server.ListenAndServeTLS("server.crt", "server.key"))
	fmt.Println("(HTTPS server would run here)")
}

// Main function
func main() {
	fmt.Println("=== Web Go HTTP Server Examples ===\n")

	BasicHTTPServerExample()
	CustomServeMuxExample()
	RestfulAPIServerExample()
	MiddlewareServerExample()
	QueryParamsServerExample()
	StaticFileServerExample()
	GracefulShutdownExample()
	JSONHandlerExample()
	FileUploadExample()
	HTTPSServerExample()

	fmt.Println("\n=== All HTTP Server Examples Completed ===")
}
CodegoIntermediate

TCP Sockets

Establish TCP connections, send/receive data, and build socket-based communication

Difficulty

6/10

Estimated time

25 min

Tags

go, web, networking

Prerequisites

Intermediate Go, net package

go
// Web Go TCP Sockets Examples
// TCP socket programming for network communication

package main

import (
	"bufio"
	"encoding/binary"
	"fmt"
	"io"
	"net"
	"strings"
	"time"
)

// 1. TCP Client

// TCPClient connects to a TCP server
func TCPClient(host string, port int) (net.Conn, error) {
	address := fmt.Sprintf("%s:%d", host, port)
	conn, err := net.Dial("tcp", address)
	if err != nil {
		return nil, fmt.Errorf("failed to connect: %v", err)
	}

	fmt.Printf("Connected to %s\n", address)
	return conn, nil
}

// TCPClientExample demonstrates TCP client
func TCPClientExample() {
	fmt.Println("--- TCP Client ---")

	// Note: This example requires a running TCP server
	conn, err := TCPClient("localhost", 8080)
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		fmt.Println("(Note: This requires a running TCP server)")
		return
	}
	defer conn.Close()

	// Send data
	message := "Hello, TCP Server!\n"
	_, err = conn.Write([]byte(message))
	if err != nil {
		fmt.Printf("Error writing: %v\n", err)
		return
	}

	fmt.Printf("Sent: %s", message)

	// Read response
	buffer := make([]byte, 1024)
	n, err := conn.Read(buffer)
	if err != nil {
		fmt.Printf("Error reading: %v\n", err)
		return
	}

	fmt.Printf("Received: %s\n", string(buffer[:n]))
}

// 2. TCP Server

// TCPServer starts a simple TCP server
func TCPServer(port int) error {
	address := fmt.Sprintf(":%d", port)
	listener, err := net.Listen("tcp", address)
	if err != nil {
		return fmt.Errorf("failed to listen: %v", err)
	}
	defer listener.Close()

	fmt.Printf("TCP Server listening on %s\n", address)

	for {
		conn, err := listener.Accept()
		if err != nil {
			fmt.Printf("Error accepting connection: %v\n", err)
			continue
		}

		fmt.Printf("New connection from %s\n", conn.RemoteAddr())

		// Handle connection in goroutine
		go handleConnection(conn)
	}
}

// handleConnection handles a client connection
func handleConnection(conn net.Conn) {
	defer conn.Close()

	remoteAddr := conn.RemoteAddr().String()
	fmt.Printf("Handling connection from %s\n", remoteAddr)

	// Read data
	buffer := make([]byte, 1024)
	n, err := conn.Read(buffer)
	if err != nil {
		fmt.Printf("Error reading from %s: %v\n", remoteAddr, err)
		return
	}

	fmt.Printf("Received from %s: %s\n", remoteAddr, string(buffer[:n]))

	// Send response
	response := fmt.Sprintf("Echo: %s", string(buffer[:n]))
	_, err = conn.Write([]byte(response))
	if err != nil {
		fmt.Printf("Error writing to %s: %v\n", remoteAddr, err)
		return
	}

	fmt.Printf("Response sent to %s\n", remoteAddr)
}

// TCPServerExample demonstrates TCP server
func TCPServerExample() {
	fmt.Println("\n--- TCP Server ---")

	fmt.Println("Starting TCP server on :8080")
	fmt.Println("(In production, server.ListenAndServe() would block here)")

	// In real usage:
	// err := TCPServer(8080)
	// if err != nil {
	// 	log.Fatal(err)
	// }

	// For demonstration, just show the concept
	conn, err := net.Listen("tcp", ":8080")
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}
	defer conn.Close()

	fmt.Println("Server would accept connections here")
}

// 3. TCP Client with Timeout

// TCPClientWithTimeout connects with timeout
func TCPClientWithTimeout(host string, port int, timeout time.Duration) (net.Conn, error) {
	address := fmt.Sprintf("%s:%d", host, port)

	conn, err := net.DialTimeout("tcp", address, timeout)
	if err != nil {
		return nil, fmt.Errorf("connection timeout: %v", err)
	}

	fmt.Printf("Connected to %s (with timeout)\n", address)
	return conn, nil
}

// TimeoutClientExample demonstrates client with timeout
func TimeoutClientExample() {
	fmt.Println("\n--- TCP Client with Timeout ---")

	conn, err := TCPClientWithTimeout("localhost", 8080, 5*time.Second)
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		fmt.Println("(Note: This requires a running TCP server)")
		return
	}
	defer conn.Close()

	fmt.Println("Connection established with timeout")
}

// 4. Bidirectional Communication

// ChatClient demonstrates bidirectional chat
func ChatClient(host string, port int) error {
	address := fmt.Sprintf("%s:%d", host, port)
	conn, err := net.Dial("tcp", address)
	if err != nil {
		return err
	}
	defer conn.Close()

	fmt.Printf("Connected to chat server %s\n", address)

	// Start goroutine to read messages
	go func() {
		scanner := bufio.NewScanner(conn)
		for scanner.Scan() {
			fmt.Printf("Server: %s\n", scanner.Text())
		}
	}()

	// Read from stdin and send to server
	scanner := bufio.NewScanner(conn)
	for scanner.Scan() {
		text := scanner.Text()
		if strings.ToLower(text) == "quit" {
			break
		}

		_, err := conn.Write([]byte(text + "\n"))
		if err != nil {
			return err
		}
	}

	return nil
}

// BidirectionalExample demonstrates bidirectional communication
func BidirectionalExample() {
	fmt.Println("\n--- Bidirectional Communication ---")

	fmt.Println("Chat client (requires running chat server)")
	fmt.Println("(In production, would run ChatClient here)")
}

// 5. UDP Client/Server

// UDPServer starts a UDP server
func UDPServer(port int) error {
	address := fmt.Sprintf(":%d", port)
	conn, err := net.ListenPacket("udp", address)
	if err != nil {
		return fmt.Errorf("failed to listen: %v", err)
	}
	defer conn.Close()

	fmt.Printf("UDP Server listening on %s\n", address)

	buffer := make([]byte, 1024)
	for {
		n, addr, err := conn.ReadFrom(buffer)
		if err != nil {
			fmt.Printf("Error reading: %v\n", err)
			continue
		}

		fmt.Printf("Received from %s: %s\n", addr, string(buffer[:n]))

		// Send response
		response := []byte("UDP Acknowledgment")
		_, err = conn.WriteTo(response, addr)
		if err != nil {
			fmt.Printf("Error writing: %v\n", err)
		}
	}
}

// UDPClient sends data to UDP server
func UDPClient(host string, port int, message string) error {
	address := fmt.Sprintf("%s:%d", host, port)
	conn, err := net.Dial("udp", address)
	if err != nil {
		return fmt.Errorf("failed to connect: %v", err)
	}
	defer conn.Close()

	fmt.Printf("Sending to %s: %s\n", address, message)

	_, err = conn.Write([]byte(message))
	if err != nil {
		return fmt.Errorf("error sending: %v", err)
	}

	// Read response
	buffer := make([]byte, 1024)
	n, err := conn.Read(buffer)
	if err != nil {
		return fmt.Errorf("error reading: %v", err)
	}

	fmt.Printf("Received: %s\n", string(buffer[:n]))
	return nil
}

// UDPExample demonstrates UDP communication
func UDPExample() {
	fmt.Println("\n--- UDP Client/Server ---")

	fmt.Println("UDP Server starting on :8081")
	fmt.Println("(In production, UDPServer would run here)")

	// Client example
	fmt.Println("\nUDP Client (requires running UDP server)")
	err := UDPClient("localhost", 8081, "Hello UDP!")
	if err != nil {
		fmt.Printf("Error: %v\n", err)
	}
}

// 6. Protocol Buffers over TCP

// SendBinaryMessage sends binary data with length prefix
func SendBinaryMessage(conn net.Conn, data []byte) error {
	// Send message length first (4 bytes)
	length := uint32(len(data))
	err := binary.Write(conn, binary.BigEndian, length)
	if err != nil {
		return fmt.Errorf("error writing length: %v", err)
	}

	// Send data
	_, err = conn.Write(data)
	if err != nil {
		return fmt.Errorf("error writing data: %v", err)
	}

	return nil
}

// ReceiveBinaryMessage receives binary data with length prefix
func ReceiveBinaryMessage(conn net.Conn) ([]byte, error) {
	// Read message length
	var length uint32
	err := binary.Read(conn, binary.BigEndian, &length)
	if err != nil {
		return nil, fmt.Errorf("error reading length: %v", err)
	}

	// Read data
	data := make([]byte, length)
	_, err = io.ReadFull(conn, data)
	if err != nil {
		return nil, fmt.Errorf("error reading data: %v", err)
	}

	return data, nil
}

// BinaryProtocolExample demonstrates binary protocol
func BinaryProtocolExample() {
	fmt.Println("\n--- Binary Protocol over TCP ---")

	fmt.Println("Binary protocol demonstration")
	fmt.Println("(Would use SendBinaryMessage and ReceiveBinaryMessage)")
}

// 7. Connection Pool

// ConnPool represents a connection pool
type ConnPool struct {
	conns chan net.Conn
	factory func() (net.Conn, error)
}

// NewConnPool creates a new connection pool
func NewConnPool(size int, factory func() (net.Conn, error)) (*ConnPool, error) {
	pool := &ConnPool{
		conns:   make(chan net.Conn, size),
		factory: factory,
	}

	// Initialize connections
	for i := 0; i < size; i++ {
		conn, err := factory()
		if err != nil {
			return nil, err
		}
		pool.conns <- conn
	}

	return pool, nil
}

// Get gets a connection from the pool
func (p *ConnPool) Get() (net.Conn, error) {
	select {
	case conn := <-p.conns:
		return conn, nil
	default:
		// Pool exhausted, create new connection
		return p.factory()
	}
}

// Put returns a connection to the pool
func (p *ConnPool) Put(conn net.Conn) {
	select {
	case p.conns <- conn:
		// Connection returned to pool
	default:
		// Pool full, close connection
		conn.Close()
	}
}

// Close closes all connections in the pool
func (p *ConnPool) Close() {
	close(p.conns)
	for conn := range p.conns {
		conn.Close()
	}
}

// ConnectionPoolExample demonstrates connection pooling
func ConnectionPoolExample() {
	fmt.Println("\n--- Connection Pool ---")

	// Create pool
	pool, err := NewConnPool(3, func() (net.Conn, error) {
		return net.Dial("tcp", "localhost:8080")
	})

	if err != nil {
		fmt.Printf("Error creating pool: %v\n", err)
		fmt.Println("(Note: This requires a running TCP server)")
		return
	}

	defer pool.Close()

	// Get connection
	conn, err := pool.Get()
	if err != nil {
		fmt.Printf("Error getting connection: %v\n", err)
		return
	}

	fmt.Printf("Got connection from pool: %v\n", conn.RemoteAddr())

	// Return connection
	pool.Put(conn)

	fmt.Println("Connection returned to pool")
}

// 8. Socket Options

// SetSocketOptions configures socket options
func SetSocketOptions(conn net.Conn) error {
	tcpConn, ok := conn.(*net.TCPConn)
	if !ok {
		return fmt.Errorf("not a TCP connection")
	}

	// Set keep-alive
	err := tcpConn.SetKeepAlive(true)
	if err != nil {
		return fmt.Errorf("error setting keep-alive: %v", err)
	}

	// Set keep-alive period
	err = tcpConn.SetKeepAlivePeriod(30 * time.Second)
	if err != nil {
		return fmt.Errorf("error setting keep-alive period: %v", err)
	}

	// Set no delay
	err = tcpConn.SetNoDelay(true)
	if err != nil {
		return fmt.Errorf("error setting no delay: %v", err)
	}

	return nil
}

// SocketOptionsExample demonstrates socket options
func SocketOptionsExample() {
	fmt.Println("\n--- Socket Options ---")

	fmt.Println("Socket options configured (keep-alive, no delay)")
	fmt.Println("(Would use SetSocketOptions on TCP connections)")
}

// Main function
func main() {
	fmt.Println("=== Web Go TCP Sockets Examples ===\n")

	TCPClientExample()
	TCPServerExample()
	TimeoutClientExample()
	BidirectionalExample()
	UDPExample()
	BinaryProtocolExample()
	ConnectionPoolExample()
	SocketOptionsExample()

	fmt.Println("\n=== All TCP Sockets Examples Completed ===")
}

Tools

Tools frequently paired with this sample

Related

Related sample collections

Tool usage guide

Sample-focused context for search and workflow understanding

Title

Web Networking Go Samples

Description

Web Go networking examples including HTTP requests, HTTP servers, and TCP sockets

Overview

Web Go networking examples including HTTP requests, HTTP servers, and TCP sockets

When to use

  • Use this sample set when you want reference inputs for Web Networking Go Samples.
  • Use it to preview output formats and compare related sample variants.

How it works

  1. 1Open a sample entry to inspect the prepared example payload or asset.
  2. 2Compare it with related tools to understand how the workflow connects.

Use cases

  • HTTP Requests
  • HTTP Server
  • TCP Sockets

FAQ

What is included in Web Networking Go Samples?

This page includes curated sample entries, related tools, and neighboring sample collections for Web Networking Go Samples.

Home
Tools3197
Samples593
Visualizations461
Viewers103
Hubs229
Tags333
Images, Audio & Video655

Image, audio, and video processing, conversion, and optimization tools

Math, Date & Finance644

Calculators, numerics, date logic, statistics, and finance tools

Design & Color296

Color, layout, graphics, visual styling, and design helper tools

Text & Writing209

Writing, cleanup, formatting, extraction, and text analysis tools

Developer & Web193

Developer utilities, networking, web debugging, and automation helpers

Conversion & Encoding175

Format, file, archive, unit, and encoding conversion tools

UI Screenshot Structure Review and Development Handoff
Piano Sketch Creation, MIDI Review and Listening Demo Handoff
Retro Game Texture Review and Asset Handoff
Screenshot-Based Procedure Guide Review and Handoff
Responsive Page Change Review and Evidence Handoff

© 2026 Elysia Tools. All rights reserved.

DocsPricingAboutTerms of ServicePrivacy PolicyCookiesContact

Web & Internet

Web Search (SearXNG JSON)

Search the web through the s.stdlang.com SearXNG instance and return its JSON response for automation or downstream tools.

Development

API Request Code Snippet Generator

Generate cURL and common language code snippets from a request URL, method, headers, query parameters, and body

Development

API Mock Server

Generate a runnable Redis-backed mock API server with 1-hour TTL, hot updates, and dynamic templated responses

Networking

BGP AS Path Loop Policy Sandbox

Simulate AS_PATH loop detection, policy filtering, attribute changes, and deterministic best-path selection.

Development

JSON to Go Struct Converter

Convert JSON data into Go struct definitions with json struct tags, exported PascalCase fields, and nested type inference

Security

JWT Decoder

Decode JWT tokens

Security

JWT Generator

Generate JWT tokens with custom claims and algorithms

Format Conversion

SSH Config Parser

Parse and convert SSH configuration file to JSON format

C++

Windows Networking - C++ Samples

Comprehensive C++ networking examples for Windows platform including HTTP requests, TCP sockets, and HTTP server implementation

C#

Windows Networking - C# Samples

Comprehensive C# networking examples for Windows platform including HTTP requests, TCP sockets, UDP communication, and web server implementation

Go

Web Data Serialization Go Samples

Web Go data serialization examples including JSON encoding/decoding and XML parsing

Document

PDF Samples

Generated PDF samples from tools dated 2026-02-01 to 2026-02-10

Objective-C

macOS Networking Objective-C Samples

macOS Objective-C networking examples including URLSession, HTTP requests, WebSocket, and network reachability

Observability

Distributed Tracing Samples

Comprehensive distributed tracing examples using Jaeger, OpenTelemetry, and other modern observability tools for microservices architecture